“( set -o posix ; set ) | less ”在做什么?

sha*_*ant 17 shell environment-variables subshell set

在我搜索列出所有 shell 变量的命令时,我以某种方式意识到,有一个命令可以列出所有环境变量,但不知何故,由于我不知道的原因,没有人列出所有 shell 变量。

但是,这里有人给出了如何显示所有变量、shell 和环境变量的答案。

( set -o posix ; set ) | less
Run Code Online (Sandbox Code Playgroud)

他其实并没有为外行解释这个表达是做什么的,我的零碎理解还不足以掌握它背后的想法。

这是我所知道的:

  • ( command1; command2)这会导致命令在 shell 的子进程内执行。
  • set是某种声明变量的方法,虽然不知道-o posix是什么意思以及为什么要连续执行第二个set

  • 命令 | 少这个不是问题,即使我理解它,它是一个寻呼机,可以更好地控制输出。

ilk*_*chu 14

set显示所有 shell 变量(导出或不导出)。在 Bash 中,set -o posix将 shell 设置为POSIX 兼容模式。(我不知道其他 shell 是否对类似的功能有类似的语法,但我会在这里假设 Bash。)

这种情况下的区别在于,通常 Bash 的set也显示 shell 函数,但在 POSIX 模式下set只显示变量,并且稍微改变了输出格式:

  1. 当 set builtin 在没有选项的情况下被调用时,它不会显示 shell 函数名称和定义。
  2. 当 set builtin 在没有选项的情况下被调用时,它显示不带引号的变量值,除非它们包含 shell 元字符,即使结果包含非打印字符。

在 Bash 中,还有一个declare内置函数可用于declare -p xx显示变量的所有其他隐藏或 Bash 特定标志:xx以 Bash 可以作为输入的格式显示变量。declare -p显示所有变量,declare -f可用于显示函数。


Ser*_*nyy 6

基本上有两件事:set在子shell中调用命令以避免弄乱您当前的shell选项,并且在列出所有变量之前将该子shell设置为POSIX模式。引用手册:

posix 更改 bash 的行为,其中默认操作不同于 POSIX 标准以匹配标准(posix 模式)。有关详细介绍 posix 模式如何影响 bash 行为的文档,请参阅下面的另请参见。

简而言之,bash在 POSIX 模式下会表现得更接近什么sh

至于 option-less set,它也在手册中,它实际上说明了为什么需要 POSIX 模式的原因

set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...] 如果没有选项,每个 shell 变量的名称和值以一种格式显示,该格式可以重复用作设置或重置当前设置的变量的输入。. . 在posix模式下,只列出shell变量。

...与变量和函数定义相反,这bash是在常规模式下所做的。

请参阅有关POSIX模式的详细信息。