我得到了類似的結果,運行「env」和「set」。集合給出更多結果 - 它是env的超集嗎?「env」和「set」(在Mac OS X或Linux上)有什麼區別?
set的手冊頁沒有給出任何信息。這些命令如何工作,有什麼區別?
我得到了類似的結果,運行「env」和「set」。集合給出更多結果 - 它是env的超集嗎?「env」和「set」(在Mac OS X或Linux上)有什麼區別?
set的手冊頁沒有給出任何信息。這些命令如何工作,有什麼區別?
長話短說:set
可以看到外殼局部變量,env
不能。
殼可以有兩種類型的變量:當地人,這是從目前的外殼,和(出口)的環境變量,這是對每一個執行的程序通過只訪問。
由於set
是一個內置的 shell命令,它也看到看到shell本地變量(包括shell函數)。 env
另一方面是獨立的可執行文件;它只會看到shell傳遞給它的變量或環境變量。
當你鍵入比如a=1
然後局部變量創建一個行(除非它已經在環境中存在)。環境變量與export a=1
'set'還可以報告shell選項(用'-o'開關),'env'沒有。 – 2016-10-29 23:25:56
set
是一個shell內建命令,而env
是一個程序(在/ usr/bin中/ ENV)
set
做幾件事情,但它本身列出的環境變量。它也可以設置/撥動開關,如set +x
或set -v
等
env
本身列出了導出環境變量,而是可以在修改的環境中運行的程序
更多信息參見man 1 env
。
否 - 'set'列出局部變量(非環境變量)以及環境變量。 – 2011-04-14 00:52:15
@Jonathan - 我認爲這實際上是從我開始時的術語變化,以及csh和sh/ksh之間的一些區別 - 以及bash從兩個shell家族中吸取的。 「回到我的時代」......所作的區分總是是否是變量的輸出,但都被稱爲「環境」變量。之後將它們稱爲「本地」與「環境」變量。 (當然,我最初在一個BSD csh的學習過,這可能是在思考和談論它的差異) – 2011-04-14 17:59:56
好吧,當我學習,環境變量是那些中導出(或者,在C shell世界, setenv'd);其他人不在任何進程的環境中,除了shell本身,並且強調不會傳遞給子進程,因此他們不以任何有意義的方式進入「環境」 - 他們在shell中是本地的,而不是環境變量。然而,你可能爲同樣的現象學到了不同的詞彙 - 但我認爲你學到的詞彙(上述)偏離了Unix社區的規範。 – 2011-04-14 18:03:24
如果你想在set
命令的輸出限制爲僅變量創建的,您可以在POSIX模式下運行:
type -a env set
help set
(set -o posix; set) | nl
如果你需要列出具體的變量更精細的控制,你可以使用Bash內建函數,如declare
或compgen
或其他一些Bash技巧。
man bash | less -p '-A action$' # info on complete & compgen
# listing names of variables
compgen -A variable | nl # list names of all shell variables
echo ${!P*} # list names of all variables beginning with P
compgen -A export | nl # list names of exported shell variables
export | nl # same, plus always OLDPWD
declare -px | nl # same
declare -pr # list readonly variables
# listing names of functions
compgen -A function | nl
declare -F | nl
declare -Fx | nl
# show code of specified function
myfunc() { echo 'Hello, world!'; return 0; }
declare -f myfunc
在http://unix.stackexchange.com/中可能會得到更好的答案。 – Jacob 2011-04-14 00:06:17
對於StackOverflow來說這是一個非常好的問題;它是關於shell編程的(並注意到「編程」出現在主題中)。 – 2011-04-14 00:53:27