スクリプト内の変数を変更しても、スクリプト外では変更されないのはなぜですか?

スクリプト内の変数を変更しても、スクリプト外では変更されないのはなぜですか?

exportターミナルで変数を作成したとします。その後、その変数を別の値に変更するスクリプトを呼び出します。しかし、ターミナルに戻ってecho変数を作成すると、元の値のままです。

変数を変更してスクリプトの外で表示したい場合はどうすればいいでしょうか?スクリプト。私が言いたいことの例は次のとおりです。

ares@ares-HP-ProBook-4530s:~$ export package=tree
ares@ares-HP-ProBook-4530s:~$ cat script3.sh 

#! /bin/bash
#set -x
echo $package
apt-cache show $1 | head -1
if [ $? -eq 0 ]; then
    package=1
else
    package=0
fi
echo $package

スクリプト実行時の出力

ares@ares-HP-ProBook-4530s:~$ ./script3.sh gnome-terminal
tree
Package: gnome-terminal
1
ares@ares-HP-ProBook-4530s:~$ echo $package
tree
ares@ares-HP-ProBook-4530s:~$ 

答え1

シェル プロセスには親プロセスの環境のコピーがあり、親プロセスの環境にはまったくアクセスできません。シェル プロセスが終了すると、その環境に加えた変更はすべて失われます。スクリプト ファイルをソース化することは、シェル環境を構成するための最も一般的な方法ですが、思い切って 2 種類のシェルごとに 1 つずつ維持することもできます。

この答えが見つかりましたここ

答え2

yourfile.sh をソースします

これで必要なことは完了するはずです。

答え3

もう 1 つの可能性は、.bashrc に関数を作成し、現在のシェル内でその関数を呼び出すことです。これにより、入力の手間が少し省けます。変数を渡すこともできます。

これは、もう少し柔軟性が必要な場合にエイリアスの代わりに使用する方法です。

答え4

新しいプロセスを取得コピーエクスポートされた各変数の。

次のいずれかを実行する必要があります。

  • すべての操作を同じプロセスで実行する(現在のシェルでスクリプトをソース化することにより)
  • 共通の場所(sqlite、フラットファイル)に値を保持し、各プロセスから読み書きする

関連情報