次のコマンドがあるとしましょう
$> MYENVVAR = myfolder echo $ MYENVVAR && MYENVVAR = myfolder ls $ MYENVVAR
つまり、MYENVVAR=myfolderが繰り返されます
コマンドを1行にまとめたまま、「&&」で区切った両方のコマンドに1回設定することはできますか?
次のコマンドがあるとしましょう
$> MYENVVAR = myfolder echo $ MYENVVAR && MYENVVAR = myfolder ls $ MYENVVAR
つまり、MYENVVAR=myfolderが繰り返されます
コマンドを1行にまとめたまま、「&&」で区切った両方のコマンドに1回設定することはできますか?
実際に環境変数として必要であると仮定します(サンプルコードは実際には環境変数を必要としませんが、一部のシェル変数は環境変数ではありません)。
(export MYENVVAR=myfolder; echo $MYENVVAR && ls $MYENVVAR)
環境変数として必要ない場合は、次のようにします。
(MYENVVAR=myfolder; echo $MYENVVAR && ls $MYENVVAR)
括弧はサブシェルを作成します。サブシェルに設定された環境変数(およびプレーン変数)は、親シェルに影響を与えません。示されている両方のコマンドで、変数は1回設定されてから、2つのコマンドのそれぞれによって1回ずつ、2回使用されます。
括弧は、独自の変数を設定できる新しいプロセスを生成します。
( MYENVVAR=myfolder; echo 1: $MYENVVAR; ); echo 2: $MYENVVAR;
1: myfolder
2:
コマンドを文字列にラップして使用eval
することは、まだ言及されていない1つの方法です。
a=abc eval 'echo $a; echo $a'
a=abc eval 'echo $a && echo $a'
または、コマンドを引用する必要なしに、環境変数とコマンドの間で汎用の多対多マッピングを使用する場合は、trap
以下の私のベースの関数を使用できます。
envMulti()
{
shopt -s extdebug;
PROMPT_COMMAND="$(trap -p DEBUG | tee >(read -n 1 || echo "trap - DEBUG")); $(shopt -p extdebug); PROMPT_COMMAND=$PROMPT_COMMAND";
eval "trap \"\
[[ \\\"\\\$BASH_COMMAND\\\" =~ ^trap ]] \
|| { eval \\\"$@ \\\$BASH_COMMAND\\\"; false; }\" DEBUG";
}
使用法:
envMulti a=aaa b=bbb; eval 'echo $a'; eval 'echo $b'
注:eval 'echo...'
上記のは私のスクリプトとは何の関係もありません。が早すぎるa=aaa echo $a
ため、直接行うことはできません。$a
または、必要にenv
応じて使用します(実際には、コマンドの前に何かを付けます)。
echo -e '#!/bin/bash\n\necho $a' > echoScript.sh
chmod +x echoScript.sh
envMulti env a=aaa; ./echoScript.sh; ./echoScript.sh
注:での使用法を示すためだけにテストスクリプトを作成しました。これは、前のデモで使用されたenv
ような組み込みを受け入れることができません。eval
ああ、そして上記はすべて、独自のシェルコマンドを手動で実行することを目的としていました。それ以外のことを行う場合は、使用に関するすべての注意事項を知っていることをeval
確認してください。つまり、コマンドのソースなどを信頼していることを確認してください。