Re: sub shell
しらいです。
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() を避けて省力化しているみたいですし。
--
しらい たかし
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735