
完全な複合コマンドに影響を与えるワンタイム変数を設定するには?
たとえば、次のようになります。
FOO=1 ./foo.sh && ./foo.sh
ここfoo.sh
にはecho "FOO=$FOO"
次のものが印刷されます。
FOO=1
FOO=
パイプライン全体に設定したい値FOO
ですが、現在のシェルでは設定したりエクスポートしたくありません。サブシェルの仕組み:
( export FOO=1; ./foo.sh && ./foo.sh )
...しかし、サブシェルがない方法はありますか?
答え1
サブシェル方法は、タイピングが少ない方法です。
(
export FOO="value"
./foo.sh && ./foo.sh
)
別のアプローチは、サブシェルを起動し、シェルの環境変数を設定することです。
FOO="value" sh -c './foo.sh && ./foo.sh'
別のバリエーションは、次のようにスクリプトの各呼び出しに対して変数を明示的に設定することです。
FOO="value" ./foo.sh &&
FOO="value" ./foo.sh
これはもう少し楽です。
foo=( env FOO="value" ./foo.sh )
"${foo[@]}" && "${foo[@]}"
または/bin/sh
、
set -- env FOO="value" ./foo.sh
"$@" && "$@"
または、呼び出しスクリプトで設定し、次のように完了したら設定を解除できます。
export FOO="value"
./foo.sh && ./foo.sh
unset FOO
答え2
あなたが求めるのは、ハッキングがなければ達成できないことです。その理由は、スクリプトを実行するとき
FOO=1 ./foo.sh && ./foo.sh
デフォルトでは、起動した親シェルのすべての属性(変数)を継承する2つの別々のシェルインスタンスを起動します。$$
の変数を印刷すると、起動されたfoo.sh
各スクリプトに別々のproc-idがあることがわかります。
最初の部分は、FOO=1
最初のプロセスが開始される環境にのみ影響します。変数はいいえ親シェルでも実行できますが、最初のプロセス範囲内でのみ実行されます。持ついいえこの変数セットは、別のユーザースペースで完全に実行される2番目のプロセスの環境に反映できます。
2番目のプロセスは、値が親から継承されるか(変数が明示的にシェルからエクスポートされたときにパイプが実行される)、値が2番目のプロセスの再スクリプトにローカルに渡されない限り、その環境でこの値を見ることはできません。