コマンドは期待どおりに機能します。
> TEST=`uuidgen` sh -c 'echo "$TEST"'
BE6DFB7B-D872-49D7-91E6-24D01644B0A2
> echo $TEST
[empty line]
TEST
コマンドラインでローカルに変数を設定し、echoコマンドでそれをエコーします。この行が実行された後はTEST
設定されなくなります。
しかし、これは
> TEST=`uuidgen` sh -c 'echo "$TEST"' && sh -c 'echo "$TEST"'
52EFFEAA-D094-4FC3-8212-6A294918E265
[empty line]
最初のコマンドには変数が設定されていますが、TEST
には&&
設定されていません。両方注文する。これを達成するための最良の方法は何ですか?
答え1
同じシェルを使用して両方のコマンドを実行できます。
TEST=`uuidgen` sh -c 'echo "$TEST" && echo "$TEST"'
答え2
もしあなたならいいえ変数の割り当てを一時的に(つまり、1つのコマンドに対してのみ)、目的の次の別々の行に割り当てます。
さまざまなタイプの変数への割り当てのいくつかの例:
TEST=foo echo "$TEST"
これは一時的に
foo
変数に値を割り当てますTEST
(そしてTEST)を次のように一時的にエクスポートします。ただその唯一のecho
コマンド。その後、以前の値(およびエクスポートされた状態)に戻ります。値がない場合は設定されません。TEST=foo echo "$TEST" NEWTEST="$TEST"
この例では、TESTは
foo
シェルが終了するか(ログアウトやスクリプトの終了など)、明示的に設定を解除するか、新しい値が割り当てられるまでその値を持つため、NEWTESTは最終的にTEST(foo)と同じ値になります。TESTはエクスポートされないため、このシェルで実行されているプログラムのコンテキストでは使用できません。
プログラムが実行されている環境で変数を使用できるようにするには、その変数をエクスポートする必要があります。
例えば
export TEST=foo
または:
TEST=foo export TEST
答え3
フルシェルセッションのexport TEST=bla
変数を設定するために使用されます。TEST
$ export TEST="coincoin"
$ echo $TEST
coincoin
$ cat test.sh
#!/bin/bash
echo "Test is ${TEST}"
$ ./test.sh
Test is coincoin