web-dev-qa-db-ja.com

`source`コマンドの反対

変数の値を読み取り/印刷するために、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 >
9
yael

サブシェルを使用する(推奨)

サブシェルでsourceコマンドを実行します。

_(
source linuxmachines_mount_point.txt
cmd1 $linuxmachine02
other_commands_using_variables
etc
)
echo $linuxmachine01  # Will return nothing
_

サブシェルは括弧で定義されます:_(...)_。サブシェル内で設定されたシェル変数は、サブシェルが終了すると忘れられます。

Unsetの使用

これにより、_linuxmachines_mount_point.txt_によってエクスポートされた変数の設定が解除されます。

_unset $(awk -F'[ =]+' '/^export/{print $2}' linuxmachines_mount_point.txt)
_
  • _-F'[ =]+'_は、フィールド区切り文字としてスペースと等号の任意の組み合わせを使用するようにawkに指示します。

  • _/^export/{print $2}_

    これはawkにexportで始まる行を選択して2番目のフィールドを出力するように指示します。

  • unset $(...)

    これは$(...)内でコマンドを実行し、そのstdoutをキャプチャして、その出力で指定された変数の設定を解除します。

21
John1024

スクリプトを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' ' ')"
4
jimmij

unsetコマンドを使用して、変数を「忘れる」ことができます。

2
francois P

期待する出力(何もない)を得る最も簡単な解決策は、変数を空として再宣言することです。

$ 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"
$
2
Isaac

これを行う最も簡単な方法は、スクリプトを変更して、スクリプトの効果を元に戻すコマンドも定義することです。

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'
1
Lie Ryan

このように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
0
ctac_

sourceコマンドを使用してVirtualEnvironmentをアクティブ化している場合は、deactivateコマンドを使用して終了できます。

0
Wolf Elkan