Learning Bash Bookでは、サブシェルは環境変数とファイル記述子などのみを継承し、エクスポートされない変数は継承しないと述べています。
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
私が知っているようにシェルがために2つのサブシェルが作成されます()
とのために./file
、なぜに()
ケースを識別サブシェルんvar
それはエクスポートされませんが、変数をし、中./file
ケース、それはそれを識別しませんでしたか?
# Strace for ()
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25617
# Strace for ./file
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25631
私が使用しようとstrace
、この問題が発生したかを把握すると、驚くほど私はbashがクローンシステムコールのために同じ引数を使用します見つけ、中にフォークプロセスの両方、この手段はそう()
と./file
、親の同じプロセスアドレス空間を持つ必要があり、なぜこの()
場合、変数はサブシェルに表示され./file
、同じ引数はクローンシステムコールに基づいていますが、同じことはケースに起こりませんか?