コンテキスト:
- オペレーティングシステム:オープン水勢の飛躍 15.1
- コア:Linux 4.12.14-lp151.27-基本
- シェル:GNU bash、バージョン 4.4.23(1)-リリース(x86_64-suse-linux-gnu)
次のスクリプトが与えられたら、test.shと呼びます。:
#!/bin/bash -e
echo "$TEST_VAR"
他の実行では、次を返します。
TEST_VAR=1234; source test.sh
->出力:1234
source test.sh ->
出力:1234
質問:
- なぜenvの価値テスト変数実行の間に持続しますか(
env | grep -i test_var)
何も返しません)? - このようなものを使用するのではなく、これを防ぐ方法はありますか
exec bash
? - 以前の質問に対する答えが「はい」の場合、少なくともどのくらいのクロスシェルであるソリューションがありますか?
ありがとうございます。
ベストアンサー1
source
(同義語.
(指す)〜する
現在の環境でコマンドを実行する
つまり、test.sh
独自の変数を持つ新しいシェルでは実行されず、単に現在のシェルの各コマンドを実行します。特に、これは#!/bin/bash -e
コメントとして扱われるシェバンを無効にします。スクリプトを次に変更する場合
set -e
echo "$TEST_VAR"
false
source
戻りコードはそのため、対話型セッションはすぐに終了しますfalse
。現在のシェルの出力をどこかに保存しないと、結果としてすべてのエラーメッセージが失われます(これは重要ではありませんが、false
実際のスクリプトには重要です)。失敗する可能性のあるスクリプトを実行するsource
ためにこの組み合わせを使用しないことをお勧めします。set -e
TEST_VAR=1234; source test.sh
単にコマンドを分離するため、TEST_VAR
値は保持されます。;
TEST_VAR=1234; source test.sh
TEST_VAR=1234
source test.sh
それは単なる課題TEST_VAR
と通貨ですsource
。source
現在の環境でコマンドが実行されるため、TEST_VAR
その環境で使用できます。
;
存在しない場合は、TEST_VAR
次のコマンド呼び出しに対してのみ割り当てを有効にして変更できますsource
。
$ cat test.sh
#!/bin/bash -e
echo $TEST_VAR
$ TEST_VAR=1234 source test.sh
1234
$ source test.sh
env | grep -i test_var
何も返さない
その理由は次のように説明されています。https://unix.stackexchange.com/a/268258/4699:
envは外部コマンド(シェル組み込みコマンドとは反対)なので、envはシェルからエクスポートされた変数のみを印刷します。
反対側のセットには、すべてのシェル変数が一覧表示されます。それらのいくつかは輸出されます。
エクスポートは、シェルからエクスポートされたシェル変数を一覧表示します。
export
セット変数のエクスポートにも使用できます。
$ TEST_VAR=1234; source test.sh
1234
$ set | grep TEST
TEST_VAR=1234
$ env | grep TEST
$ export TEST_VAR
$ env | grep TEST
TEST_VAR=1234