全体として、メインシェル内で一連のコマンドを実行してみましたが、学んだ方法はサブシェルでのみ機能します。
答え1
何を意味するかによって異なります全体的に。
複数のコマンドをシェルに送信し、そのコマンドをすべて入力するまでシェルでコマンドの実行を開始したくない場合は、次のようにします。
cmd1; cmd2
または
コマンド1Ctrl+VCtrl+Jコマンド2
(または角かっこ貼り付け(bind 'set enable-bracketed-paste on'
)を有効にし、角かっこ貼り付けをサポートする端末からコマンドを貼り付けます。)
または:
{
cmd1
cmd2
}
行にしてください。
たとえば、同じstdinまたはstdoutを共有するようにグループ化するには、次のようにします。
{ cmd1; cmd2; } < in > out
または
eval 'cmd1; cmd2' < in > out
bash
対応する匿名関数がないため、独自の変数とオプションの範囲で実行するにはzsh
一時関数を定義する必要があります。
f() { local var; var=foo; bar;}; f
答え2
サブシェルで始まったものではなく、現在のシェルで始まったものを使用してください( something )
。something
{ something ; }
something
後ろにはスペースを入れ、前に(または改行)文字を{
付ける必要があります。;
}
前任者:
$ { echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID" ; }
hello 3536
hello again 3536
ただし、一部の複雑なコマンド(またはパイプコマンド)を実行している場合、ほとんどの場合、これらのコマンドはサブシェルにあります。
現在のシェルのpidを取得する「移植可能な」方法は$$
。
そのため、テストを次のように作成します。
{ echo "hello $$"; sleep 5 ; echo "hello again $$" ; }
(とにかくここでは睡眠はあまり役に立ちません)