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

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

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

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

( set -o posix ; set ) | less

他实际上并没有为外行解释这个表达式的作用,而我零碎的理解不足以掌握其背后的思想。

这是我所知道的:

  • (命令 1;命令 2)这会导致命令在 shell 的子进程内执行。
  • 是一些声明变量的方法,虽然不知道是什么-o posix意味着以及为什么第二被连续执行

  • 命令|较少的这不是问题,即使我理解它,它是一个寻呼机,用于对输出进行更多控制。

答案1

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

这种情况的区别在于,通常 Bashset还显示 shell 函数,但在 POSIX 模式下set仅显示变量,并稍微更改输出格式:

  1. 当不带选项调用 set 内置函数时,它不会显示 shell 函数名称和定义。
  2. 当不带选项调用 set 内置函数时,它会显示不带引号的变量值,除非它们包含 shell 元字符,即使结果包含非打印字符也是如此。

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

答案2

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

posix 更改默认操作与 POSIX 标准不同的 bash 行为以匹配标准(posix 模式)。请参阅下面的文档参考,该文档详细介绍了 posix 模式如何影响 bash 的行为。

简而言之,bash在 POSIX 模式下的行为会更接近sh

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

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

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

有关 POSIX 模式的更多信息。

相关内容