【问题标题】:What's the difference between "env" and "set" (on Mac OS X or Linux)? [closed]“env”和“set”(在 Mac OS X 或 Linux 上)有什么区别? [关闭]
【发布时间】:2011-08-05 03:36:54
【问题描述】:

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

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

【问题讨论】:

  • unix.stackexchange.com 中可能会得到更好的答案。
  • 对于 StackOverflow 来说这是一个非常好的问题;它是关于 shell 编程的(请注意主题中出现了“编程”)。
  • 由于set是内置的shell,我们需要help set来查看手册。 env 不是内置的 shell,man env 会显示手册。

标签: linux bash macos environment-variables


【解决方案1】:

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

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

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

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

【讨论】:

  • set 还可以报告 env 没有的 shell 选项(使用 -o 开关)。
【解决方案2】:

如果您想将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  

【讨论】:

  • 该死的!这个答案在世界上怎么没有更多的赞成票?非常感谢我的老兄发布这个,传统的 shell (!{fish,nu}) 有时会很神秘。
【解决方案3】:

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

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

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

更多信息请参见man 1 env

【讨论】:

  • 否 - set 列出局部变量(非环境变量)以及环境变量。
  • @Jonathan - 我认为这确实是我开始时的术语变化,以及 csh 和 sh/ksh 之间的一些差异 - 并且 bash 来自两个 shell 系列。 “回到我的日子”......所做的区别始终是变量是否被导出,但两者都被称为“环境”变量。后来称它们为“本地”与“环境”变量。 (当然,我最初是在 BSD csh 环境中学习的,这可能是思考和谈论它的区别)
  • 嗯,当我学习的时候,环境变量是那些被导出的(或者,在 C shell 世界中,setenv'd);其他的不在任何进程的环境中,除了 shell 本身,并且强调没有中继到子进程,所以它们没有以任何有意义的方式在“环境”中 - 它们是 shell 的本地而不是环境变量。但是,您可能为相同的现象学习了不同的词汇 - 但我认为您学习的词汇(如上所述)偏离了整个 Unix 社区的规范。
  • @StephenP:csh 命令setenv 提供了有关预期术语的线索:“设置 environment 变量”。我想也许你从那里学到的人使用了错误的术语。也有可能发生了转变(这些事情发生了),但setenv 命令让我猜测不是这样。我在 92 年或 93 年使用csh,但我不记得清楚的术语......也许你指的是更早的时间......
猜你喜欢
  • 1970-01-01
  • 2019-06-08
  • 2011-12-24
  • 2012-12-27
  • 1970-01-01
  • 2014-12-12
  • 2017-03-05
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多