私がこうすれば:
SUMAN_DEBUG=foo echo $SUMAN_DEBUG
何の出力も得られません。
しかし、これを行うと:
SUMAN_DEBUG=foo && echo $SUMAN_DEBUG
それから私は得ます
「金持ち」
なぜそんなことですか?
答え1
[この回答は正しくありません。問題は、コマンドラインで変数を割り当てる前に発生する変数の拡張が原因で発生します。以下のコメントをご覧ください。さらに、この質問は重複として宣言され、元の質問でよく議論されました。 -gt]
SUMAN_DEBUG=foo
前のコマンドにのみ存在するローカル変数に対するローカル環境変数の割り当て。 2番目のケースでは、&&
コマンドリストが実行されたため、コマンドはありません。あなたの場合、最初のコマンドは空であり(したがって環境変数はコマンドに影響を与えません)、2番目のコマンドは実行されますが、環境変数には設定されません。
export
変数がグローバル環境変数になるように割り当てに追加できます。ただし、コマンドのリストが完了した後も持続します。
別のオプションは、コマンドの完全なリストを括弧内に入れてサブシェルで実行することです。
(export SUMAN_DEBUG=foo && echo $SUMAN_DEBUG)
この場合、永続環境変数はサブシェルに設定され、サブシェルが操作を完了すると環境は消えます。
よりBourneagain シェルマニュアル、部品リストおよび情報環境もっと学ぶ。
答え2
コマンドラインでは、;
またはでコマンドを区切る必要があります&&
。スペースは CLI コマンドの区切り文字ではありません。
最初のコマンドが正常に終了すると(終了コード0)、2番目の&&
コマンドが実行されます。
;
第2の命令は、第1の命令の終了状態に関係なく実行される。
テスト:
# a1;echo hello
bash: a1: command not found
hello
# a1 && echo hello
bash: a1: command not found
スクリプトでは、最初と2番目のコマンドは、\n
bashでも認識される改行文字で区切られています。