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

运行“env”和“set”的结果类似。 集合给出更多的结果 – 它是env的超集吗?

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

Solutions Collecting From Web of "“env”和“set”(在Mac OS X或Linux上)有什么区别?"

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

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

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

当你输入一个如a=1的行时,就会创建一个局部变量(除非它已经存在于环境中)。 环境变量是用export a=1创建的

如果要将set命令的输出仅限制为变量,则可以以POSIX模式运行它:

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

如果您需要更好地控制列出特定变量,您可以使用Bash内建compgen (如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 

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

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

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

请参阅man 1 env了解更多信息。