什么';这两者之间的区别是什么;环境";及;“设置”;(在Mac OS X或Linux上)?

什么';这两者之间的区别是什么;环境";及;“设置”;(在Mac OS X或Linux上)?,linux,bash,macos,environment-variables,Linux,Bash,Macos,Environment Variables,我在运行“env”和“set”时得到了类似的结果。集合提供更多结果-它是env的超集吗 set的手册页未提供任何信息。这些命令是如何工作的?它们之间有什么区别?set是一个内置的shell,而env是一个程序(/usr/bin/env) set执行多项操作,但它本身列出了环境变量。它还可以设置/切换开关,例如set+x或set-v等 env本身列出了导出的环境变量,但可以在修改后的环境中运行程序 有关详细信息,请参见man 1 env。长话短说:set可以查看shell局部变量,env不能 sh

我在运行“env”和“set”时得到了类似的结果。集合提供更多结果-它是env的超集吗


set的手册页未提供任何信息。这些命令是如何工作的?它们之间有什么区别?

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

set
执行多项操作,但它本身列出了环境变量。它还可以设置/切换开关,例如
set+x
set-v

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


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

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

shell可以有两种类型的变量:局部变量(只能从当前shell访问)和(导出的)环境变量(传递给每个执行的程序)

由于
set
是一个内置的shell命令,因此它还可以查看shell局部变量(包括shell函数)<另一方面,code>env是一个独立的可执行文件;它只看到shell传递给它的变量或环境变量


当您键入类似
a=1
的行时,将创建一个局部变量(除非环境中已经存在)。使用
export a=1
创建环境变量如果您想将
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  

对于这类问题,我们可能会在年得到更好的答案。这对于StackOverflow来说是一个非常好的问题;这是关于shell编程的(注意主题中出现了“编程”)。由于
set
是shell内置的,我们需要
help set
来查看手册
env
不是一个内置的shell,
man env
会显示手册。No-
set
列出了局部变量(非环境变量)以及环境变量。@Jonathan-我想这是我开始时术语上的一个变化,csh和sh/ksh之间的一些差异——和bash都是从两个shell族中提取的。“回到我的时代”。。。区别总是在于是否导出变量,但两者都被称为“环境”变量。后来人们把它们称为“本地”变量和“环境”变量。(当然,我最初是在BSD csh环境中学习的,这可能是思考和谈论它的不同之处)好吧,当我学习时,环境变量是那些导出的变量(或者,在C shell世界中,setenv'd);除shell本身外,其他进程不在任何进程的环境中,并且显然不传递给子进程,因此它们不以任何有意义的方式在“环境”中-它们是shell的局部变量,而不是环境变量。然而,对于相同的现象,您可能学习了不同的词汇表-但我认为您所学习的词汇表(如上所述)与整个Unix社区的规范不符。@StephenP:csh命令
setenv
提供了一条关于预期术语的线索:“set environment variable”。我想也许你从那些人那里学到的是错误的术语。也有可能发生了变化(这些事情发生了),但是
setenv
命令让我猜测不是这样。早在1992年或93年,我就在使用csh,但我记不清术语了。。。也许你指的是更早的时间…
set
还可以报告shell选项(使用
-o
开关),而
env
却没有!这个答案怎么会没有更多的选票呢?非常感谢我的朋友发布这篇文章,传统的贝壳(!{fish,nu})有时会很神秘。