複数の環境変数を単一の変数に割り当て、コマンドに基づいて拡張します。

複数の環境変数を単一の変数に割り当て、コマンドに基づいて拡張します。

コマンドを実行するさまざまな注文の前に、同じ環境変数文字列を繰り返したいとします。

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

それらを組み合わせる方法はありますか?いくつかのオプション

  1. それらを設定することでexport

    export TZ=GMT
    export LC_ALL=C
    export LONG_ENV_VAR=foo
    if [[ ]] # ...
    

    これは機能しますが、環境に設定された状態を維持したくありません。

  2. 変数変数を作ろう!

    local cmd_args="TZ=GMT LC_ALL=C LONG_ENV_VAR=foo"
    

    残念ながら、次のように実行しようとすると:

    $cmd_args my_command
    

    私は持っていますTZ=GMT: command not found

  3. 毎回すべてリストします。

私もグーグルをしてみましたが、「環境変数変数」は検索が最も簡単な用語ではなく、結果も出ませんでした。 #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 "$@"

覚えておいてください:空"$@"!= ""。ただそこにはない

関連情報