37

次のコマンドがあるとしましょう

$> MYENVVAR = myfolder echo $ MYENVVAR && MYENVVAR = myfolder ls $ MYENVVAR

つまり、MYENVVAR=myfolderが繰り返されます

コマンドを1行にまとめたまま、「&&」で区切った両方のコマンドに1回設定することはできますか?

4

4 に答える 4

48

実際に環境変数として必要であると仮定します(サンプルコードは実際には環境変数を必要としませんが、一部のシェル変数は環境変数ではありません)。

(export MYENVVAR=myfolder; echo $MYENVVAR && ls $MYENVVAR)

環境変数として必要ない場合は、次のようにします。

(MYENVVAR=myfolder; echo $MYENVVAR && ls $MYENVVAR)

括弧はサブシェルを作成します。サブシェルに設定された環境変数(およびプレーン変数)は、親シェルに影響を与えません。示されている両方のコマンドで、変数は1回設定されてから、2つのコマンドのそれぞれによって1回ずつ、2回使用されます。

于 2012-12-24T20:41:35.353 に答える
3

括弧は、独自の変数を設定できる新しいプロセスを生成します。

( MYENVVAR=myfolder; echo  1: $MYENVVAR; ); echo  2: $MYENVVAR;
1: myfolder
2:
于 2012-12-24T20:34:44.907 に答える
1

コマンドを文字列にラップして使用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確認してください。つまり、コマンドのソースなどを信頼していることを確認してください。

于 2021-03-31T13:45:33.033 に答える
0

次のようなエクスポートの使用を検討しましたか

export MYENVVAR=myfolder

echo $MYENVVAR次に、 (サブシェルでも機能する)などのコマンドを入力します。

于 2012-12-24T18:57:02.600 に答える