コマンドを実行するさまざまな注文の前に、同じ環境変数文字列を繰り返したいとします。
if [[ some_thing ]]; then
TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command
elif [[ some_other_thing ]]; then
TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command --with-arg
else
TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command --with-other-arg
fi
それらを組み合わせる方法はありますか?いくつかのオプション
それらを設定することで
export
export TZ=GMT export LC_ALL=C export LONG_ENV_VAR=foo if [[ ]] # ...
これは機能しますが、環境に設定された状態を維持したくありません。
変数変数を作ろう!
local cmd_args="TZ=GMT LC_ALL=C LONG_ENV_VAR=foo"
残念ながら、次のように実行しようとすると:
$cmd_args my_command
私は持っています
TZ=GMT: command not found
。毎回すべてリストします。
私もグーグルをしてみましたが、「環境変数変数」は検索が最も簡単な用語ではなく、結果も出ませんでした。 #2で私がやろうとしていることに対する解決策はありますか?それとも#1のいくつかのバージョンに固執し、変数を設定解除する必要がありますか?
答え1
これにはサブシェルを使用できます。
(
export TZ=GMT LC_ALL=C LONG_ENV_VAR=foo
if [[ some_thing ]]; then
exec my_command
…
fi
)
これにより、変数を一度明確に設定できます。サブシェルで実行されているすべての項目に表示され、デフォルトのシェル環境には表示されません。
答え2
これを行う方法はいくつかあります。個人的に私はこの機能がより明確だと思います。
run_this(){
TZ=GMT LC_ALL=C LONG_ENV_VAR=foo "$@"
}
if [[ some_thing ]]; then
run_this my_command
elif [[ some_other_thing ]]; then
run_this my_command --with-arg
else
run_this my_command --with-other-arg
fi
答え3
ポイント2は次のように達成できますenv
。
local env_args="greppable1=foo greppable2=bar"
env $env_args perl -E 'say for grep /greppable/, keys %ENV'
ただし、envパラメーターにスペースが含まれていると、bashトークン化規則によってこの問題が複雑になる可能性があります。
答え4
arg 配列の用途は次のとおりです。
if thing
then set --
elif something
then set -- --with_arg
else set -- --other_arg
fi&& TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command "$@"
覚えておいてください:空"$@"
!= ""
。ただそこにはない。