我得到类似的结果“env”和“set”。 Set给出更多结果 - 它是env的超集吗?
set的手册页不提供任何信息。这些命令如何工作,有什么区别?
答案 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内置函数,例如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
答案 2 :(得分:2)
set
是内置的shell,而env
是一个程序(/ usr / bin / env)
set
做了几件事,但它本身列出了环境变量。它还可以设置/切换开关,例如set +x
或set -v
等。
env
本身列出导出的环境变量,但可以在修改后的环境中运行程序
有关详细信息,请参阅man 1 env
。