Environment-Variables
如何在不失去其價值的情況下取消導出變數?
假設我導出了一個變數:
foo=bar export foo
現在,我想取消導出它。也就是說,如果我這樣做,我不
sh -c 'echo "$foo"'
應該得到bar
.foo
根本不應該出現在sh -c
’s 環境中。sh -c
只是一個例子,一種顯示變數存在的簡單方法。命令可以是任何東西——它可能是其行為僅受其環境中存在的變數影響的東西。我可以:
unset
變數,並失去它env
使用每個命令刪除它:env -u foo sh -c 'echo "$foo"'
- 如果您想繼續使用目前的 shell 一段時間,這是不切實際的。
理想情況下,我想保留變數的值,但不讓它出現在子程序中,甚至不作為空變數。
我想我可以這樣做:
otherfoo="$foo"; unset foo; foo="$otherfoo"; unset otherfoo
otherfoo
如果它已經存在,這可能會被踩到。這是唯一的方法嗎?有沒有標準的方法?
沒有標準的方法。
您可以通過使用函式來避免使用臨時變數。以下函式注意保持未設置的變數未設置和空變數為空。但是,它不支持某些 shell 中的功能,例如只讀或類型變數。
unexport () { while [ "$#" -ne 0 ]; do eval "set -- \"\${$1}\" \"\${$1+set}\" \"\$@\"" if [ -n "$2" ]; then unset "$3" eval "$3=\$1" fi shift; shift; shift done } unexport foo bar
在 ksh、bash 和 zsh 中,您可以使用
typeset +x foo
. 這保留了諸如類型之類的特殊屬性,因此最好使用它。我認為所有具有typeset
內置功能的外殼都有typeset +x
.case $(LC_ALL=C type typeset 2>&1) in typeset\ *\ builtin) unexport () { typeset +x -- "$@"; };; *) unexport () { … };; # code above esac
**編輯:**僅供
bash
參考,正如評論中指出的那樣:從每個給定名稱中刪除屬性的
-n
選項。(見。)export``export``help export
所以*對於
bash
,*你想要的命令是:export -n foo