2011-04-13 124 views
26

我得到了類似的結果,運行「env」和「set」。集合給出更多結果 - 它是env的超集嗎?「env」和「set」(在Mac OS X或Linux上)有什麼區別?

set的手冊頁沒有給出任何信息。這些命令如何工作,有什麼區別?

+0

在http://unix.stackexchange.com/中可能會得到更好的答案。 – Jacob 2011-04-14 00:06:17

+1

對於StackOverflow來說這是一個非常好的問題;它是關於shell編程的(並注意到「編程」出現在主題中)。 – 2011-04-14 00:53:27

回答

39

長話短說:set可以看到外殼局部變量,env不能。

殼可以有兩種類型的變量:當地人,這是從目前的外殼,和(出口)的環境變量,這是對每一個執行的程序通過只訪問。

由於set是一個內置的 shell命令,它也看到看到shell本地變量(包括shell函數)。 env另一方面是獨立的可執行文件;它只會看到shell傳遞給它的變量或環境變量。

當你鍵入比如a=1然後局部變量創建一個行(除非它已經在環境中存在)。環境變量與export a=1

+0

'set'還可以報告shell選項(用'-o'開關),'env'沒有。 – 2016-10-29 23:25:56

2

set是一個shell內建命令,而env是一個程序(在/ usr/bin中/ ENV)

set做幾件事情,但它本身列出的環境變量。它也可以設置/撥動開關,如set +xset -v

env本身列出了導出環境變量,而是可以在修改的環境中運行的程序

更多信息參見man 1 env

+1

否 - 'set'列出局部變量(非環境變量)以及環境變量。 – 2011-04-14 00:52:15

+0

@Jonathan - 我認爲這實際上是從我開始時的術語變化,以及csh和sh/ksh之間的一些區別 - 以及bash從兩個shell家族中吸取的。 「回到我的時代」......所作的區分總是是否是變量的輸出,但都被稱爲「環境」變量。之後將它們稱爲「本地」與「環境」變量。 (當然,我最初在一個BSD csh的學習過,這可能是在思考和談論它的差異) – 2011-04-14 17:59:56

+0

好吧,當我學習,環境變量是那些中導出(或者,在C shell世界, setenv'd);其他人不在任何進程的環境中,除了shell本身,並且強調不會傳遞給子進程,因此他們不以任何有意義的方式進入「環境」 - 他們在shell中是本地的,而不是環境變量。然而,你可能爲同樣的現象學到了不同的詞彙 - 但我認爲你學到的詞彙(上述)偏離了Unix社區的規範。 – 2011-04-14 18:03:24

3

如果你想在set命令的輸出限制爲僅變量創建的,您可以在POSIX模式下運行:

type -a env set 
help set 
(set -o posix; set) | nl 

如果你需要列出具體的變量更精細的控制,你可以使用Bash內建函數,如declarecompgen或其他一些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 
相關問題