Environment-Variables

如何在不失去其價值的情況下取消導出變數?

  • January 15, 2018

假設我導出了一個變數:

foo=bar
export foo

現在,我想取消導出它。也就是說,如果我這樣做,我不sh -c 'echo "$foo"'應該得到bar. foo根本不應該出現在sh -c’s 環境中。 sh -c只是一個例子,一種顯示變數存在的簡單方法。命令可以是任何東西——它可能是其行為僅受其環境中存在的變數影響的東西。

我可以:

  1. unset變數,並失去它
  2. 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

引用自:https://unix.stackexchange.com/questions/252747