如何删除set命令显示的功能?

frp*_*han 8 shell bash set

当 set 命令不带任何选项使用时,它会显示所有 shell 变量和函数的名称和值。

我们只想显示变量并避免输出中的函数。

jll*_*gre 15

正如我在评论中已经说过的,env不符合要求,因为它只显示导出的变量。

处理set输出以过滤掉任何看起来不像变量定义的东西是一种不可靠的技巧。您尤其会错过值包含换行符的一部分变量。更糟糕的是,精心编写的函数可能会出现虚假的变量定义。

最简单的解决方案是暂时切换到 POSIX 模式,其中函数不被视为(某种)变量:

set -o posix
set
set +o posix
Run Code Online (Sandbox Code Playgroud)

但是,如果您的默认模式已经是 POSIX,或者您希望该命令在 shell 设置为的任何 POSIX 模式下工作,则会出现问题。

在这种情况下,这里有一个解决方法:

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

这只会为set在子 shell 中执行的内置命令设置 POSIX 模式,而父 shell 模式不受影响。