“env”和“set”之间有什么区别(在Mac OS X或Linux上)?

时间:2011-04-13 23:56:43

标签: linux bash macos environment-variables

我得到类似的结果“env”和“set”。 Set给出更多结果 - 它是env的超集吗?

set的手册页不提供任何信息。这些命令如何工作,有什么区别?

3 个答案:

答案 0 :(得分:49)

长话短说:set可以看到shell局部变量,env不能。

Shell可以有两种类型的变量:locals,只能从当前shell访问,以及(导出的)环境变量,它们被传递给每个执行的程序。

由于set内置 shell命令,因此它也会看到shell-local变量(包括shell函数)。另一方面,env是一个独立的可执行文件;它只能看到shell传递给它的变量或环境变量。

当您键入a=1之类的行时,会创建一个局部变量(除非它已存在于环境中)。使用export a=1

创建环境变量

答案 1 :(得分: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  

答案 2 :(得分:2)

set是内置的shell,而env是一个程序(/ usr / bin / env)

set做了几件事,但它本身列出了环境变量。它还可以设置/切换开关,例如set +xset -v等。

env本身列出导出的环境变量,但可以在修改后的环境中运行程序

有关详细信息,请参阅man 1 env