しらいです。

In article <041130023727.M0121228@bureau.foc.jp>,  <ei-news@foc.jp> wrote:
>In article <cof897$s1s$1@zzr.yamada.gr.jp> on fj.unix.shells,
>    ziwndm@hotmail.com wrote:
> | shで{command;}はサブシェルを起動せず、(command)はサブシェルを起動します
> | が、{command;}& と(command)& の違いはなんでしょうか。

 「{ command; }」のように空白を入れないと文法違反ですよ。何
故か zsh では error になりませんが、こいつは hybrid なので正
しい文法が何なんだか良く判らないし。


>  無。

 shell の実装依存ですが、前者だと「command」は shell の子プ
ロセスになるのに対して後者だと孫プロセスになりませんか?実際、
Bourne shell や A shell ではそうなります。
 些細な違いに見えるかも知れませんが、orphaned なプロセスの
扱いがシビアな場合には、子か孫かで扱いが異なりますよね。

 ただ、最近の高機能 shell だと最適化によりこの辺りの無駄を
省いてしまうので、Korn shell や bash や zsh なんかは () の存
在を無視して子プロセスとして起動するようです。
 bash でも孫を作ろうとすると、「({ command; })&」で何とか出
来ますね。ksh も同じやり方で可能ですが zsh は駄目でした。や
っぱ zsh は Bourne shell 系と考えるのはよしましょう。

# bash は結構こういう小細工をしますね。pipe の実装でも極力
#fork() を避けて省力化しているみたいですし。

-- 
                                               しらい たかし