変数の値を読み取り/印刷するために、bashスクリプトでsource
コマンドを使用します
more linuxmachines_mount_point.txt
export linuxmachine01="sdb sdc sdf sdd sde sdg"
export linuxmachine02="sde sdd sdb sdf sdc"
export linuxmachine03="sdb sdd sdc sde sdf"
export linuxmachine06="sdb sde sdf sdd"
source linuxmachines_mount_point.txt
echo $linuxmachine01
sdb sdc sdf sdd sde sdg
変数の設定を解除するためのsource
の反対は何ですか?
推測される結果
echo $linuxmachine01
< no output >
サブシェルでsourceコマンドを実行します。
_(
source linuxmachines_mount_point.txt
cmd1 $linuxmachine02
other_commands_using_variables
etc
)
echo $linuxmachine01 # Will return nothing
_
サブシェルは括弧で定義されます:_(...)
_。サブシェル内で設定されたシェル変数は、サブシェルが終了すると忘れられます。
これにより、_linuxmachines_mount_point.txt
_によってエクスポートされた変数の設定が解除されます。
_unset $(awk -F'[ =]+' '/^export/{print $2}' linuxmachines_mount_point.txt)
_
_-F'[ =]+'
_は、フィールド区切り文字としてスペースと等号の任意の組み合わせを使用するようにawkに指示します。
_/^export/{print $2}
_
これはawkにexport
で始まる行を選択して2番目のフィールドを出力するように指示します。
unset $(...)
これは$(...)
内でコマンドを実行し、そのstdoutをキャプチャして、その出力で指定された変数の設定を解除します。
スクリプトをun source
することはできません。
あなたができることは、エクスポートされたすべての変数を一時ファイルに保存し、スクリプトが読み込まれた後に変数と比較し、unset
でオーバーフローを削除することです。例:
export > temp_file
source myscript
#... do some stuff
unset "$(comm -3 <(sort temp_file) <(export | sort) | awk -F'[ =]' '{print $3}' | tr '\n' ' ')"
unset
コマンドを使用して、変数を「忘れる」ことができます。
期待する出力(何もない)を得る最も簡単な解決策は、変数を空として再宣言することです。
$ export linuxmachine01="sdb sdc sdf sdd sde sdg"
$ echo "$linuxmachine01"
sdb sdc sdf sdd sde sdg
$ linuxmachine01=""
$ echo "$linuxmachine01"
$
もちろん、変数はまだ定義(およびエクスポート)されており、空ですが定義されています。
$ declare -p linuxmachine01
declare -x linuxmachine01=""
環境と実行中のシェルの両方から変数を正しく削除するには、unsetを使用する必要があります(推奨される方法)。
$ unset linuxmachine01
$ declare -p linuxmachine01
bash: declare: linuxmachine01: not found
$ echo "$linuxmachine01"
$
これを行う最も簡単な方法は、スクリプトを変更して、スクリプトの効果を元に戻すコマンドも定義することです。
export linuxmachine01="sdb sdc sdf sdd sde sdg"
export linuxmachine02="sde sdd sdb sdf sdc"
export linuxmachine03="sdb sdd sdc sde sdf"
export linuxmachine06="sdb sde sdf sdd"
alias linuxmachines_mount_point='for v in linuxmachine01 linuxmachine02 linuxmachine03 linuxmachine04; do unset $v; done; unalias linuxmachines_mount_point'
このようにlinuxmachines_mount_point.txtを書くことができます
test "$linuxmachine01" && unset -v linuxmachine01 || linuxmachine01="sdb sdc sdf sdd sde sdg"
変数が必要なとき
source linuxmachines_mount_point.txt
変数を削除したいとき
source linuxmachines_mount_point.txt
source
コマンドを使用してVirtualEnvironment
をアクティブ化している場合は、deactivate
コマンドを使用して終了できます。