シェル変数への変更を復元するにはどうすればよいですか?

シェル変数への変更を復元するにはどうすればよいですか?

実験の目的で...

私がこれをやったとしよう

bash="unset DISPLAY; export DISPLAY"

そうすれば、未定義にすることができますDISPLAY。元の値セットを復元するにはどうすればいいでしょうか? または、少なくともそれが何であったかを知るにはどうすればいいでしょうか?

答え1

一般的には事前に書き留めておきます。

理論上これについて質問しているのであれば、変更する前に古い値を別の場所に保存しておき、必要なときにいつでも元に戻すだけです。

あなたが今困窮していて、何か救いの手を差し伸べてくれるものがあればと期待してこのことについて質問しているのであれば、悪い知らせがあります...

答え2

これを簡単に行う方法があるかどうかはわかりません(たとえば、cd -最新のコマンド間を前後に移動する場合など)cd

これを実行するコンテキストは何ですか。これを自動的に利用できるようにしたいのですか? これはどのシェルの機能としても認識していません。

明らかな解決策の 1 つは、変数を変更する前に明示的に保存し、後で復元することです。例として、VENDOR 環境変数を使用します。

$ echo $VENDOR
intel

元の値を保存します:

$ pre_VENDOR=$VENDOR
$ echo $pre_VENDOR
intel

新しい値を割り当てます:

$ VENDOR='Zippy'
$ echo $VENDOR
Zippy

元の値を復元します:

$ VENDOR=$pre_VENDOR
$ echo $VENDOR
intel

答え3

できません。元に戻すことはできません。後で使用したい場合は、値を別の変数 (またはファイルなど任意の場所) に保存してください。

old_DISPLAY=$DISPLAY
unset DISPLAY
DISPLAY=$old_DISPLAY

環境変数なしで単一のコマンドを実行する場合は、 を使用しますenv

env -u DISPLAY emacs

この構文を使用して、この 1 つのコマンドに対してのみVAR=VALUE COMMAND環境変数をVAR指定された値に設定することもできます。

$ echo $DISPLAY
:0
$ DISPLAY=:1 xterm & # shows the xterm window on display :1
$ echo $DISPLAY
:0

この方法では変数を設定解除することはできませんが、空の値に設定することはできます。多くの場合、これで十分です。

変更をサブシェルにローカルに保持することもできます。括弧はサブシェルで実行するコマンドを区切ります。

$ env | grep -E 'FOO|BAR'
FOO=value_of_FOO
BAR=value_of_BAR
$ (export FOO=other_value; unset BAR; env | grep -E 'FOO|BAR')
FOO=other_value
$ env | grep -E 'FOO|BAR'
FOO=value_of_FOO
BAR=value_of_BAR

異なる環境で別のシェルを実行できます。親シェルに戻るには、exitまたはCtrl+ と入力します。D

$ bash
$ # change the environment, change directories, etc.
$ exit
$ # now you're back to the parent shell with its environment as you left it

関連情報