source
変数の値を読み取ったり印刷したりするために、bashスクリプトはこのコマンドを使用しています。
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 >
答え1
サブシェルの使用(推奨)
サブシェルで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 に次の行を選択し、2 番目のフィールドを
export
印刷するように指示します。unset $(...)
これにより、内部でコマンドが実行され、標準出力が
$(...)
キャプチャされ、出力内の名前付きすべての変数が設定解除されます。
答え2
source
スクリプトをキャンセルできません。
エクスポートしたすべての変数を一時ファイルに保存し、スクリプトをインポートして変数と比較し、Remove Overflowを使用しますunset
。たとえば、次のようになります。
export > temp_file
source myscript
#... do some stuff
unset "$(comm -3 <(sort temp_file) <(export | sort) | awk -F'[ =]' '{print $3}' | tr '\n' ' ')"
答え3
コマンドを使用して変数を「忘れる」ことができますunset
。
答え4
最も簡単な方法は、スクリプト効果をキャンセルするコマンドも定義するようにスクリプトを変更することです。
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'