メインシェル内で一連のコマンド全体を実行しようとしましたが、教えられた方法はサブシェル内でのみ機能します。
答え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 $$" ; }
(いずれにせよ、ここではスリープはあまり役に立ちません)