使用 bash“set”命令的异常结果

使用 bash“set”命令的异常结果

当在 bash 提示符下发出set不带参数的命令时(应该输出 shell 变量及其值的列表),会滚动显示 8,274 行脚本。检查此脚本表明它是指示 shell 执行命令的指令 - 而且它似乎运行 python 脚本,这使其成为一个庞大的拼凑物。我见过其他内置函数以几种方式运行

无输出:

Me:~$ wait
Me:~$ true
Me:~$ test

出现错误,没有使用提示:

Me:~$ select
bash: syntax error near unexpected token `newline'

出现错误,并附有使用提示:

Me:~$ source
bash: source: filename argument required
source: usage: source filename [arguments]
Me:~$ return
bash: return: can only `return' from a function or sourced script

我不明白为什么set会有这样的行为。这似乎没有记录,而且我也没有想到会这样。我很困惑为什么会发生这种情况。有人能解释一下吗?

答案1

这 8k 行主要是来自 bash-completion 包的补全函数。在我的旧台式机上,bash 几乎花了一秒钟来读取和定义所有这些函数,其中大部分我从未使用过,所以我禁用了它。

要禁用它,请编辑您的 ~/.bashrc,找到末尾附近的这三行,并#在每行前面添加一个。

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

下次运行交互式 bash 会话时,set只会输出大约 50-100 行;主要是环境变量和特殊的 shell 变量。

答案2

http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html

如果没有提供选项或参数,set 将显示所有 shell 变量和函数的名称和值,并根据当前区域设置排序,其格式可以重新用作设置或重置当前设置的变量的输入。

您可以在以下位置找到相同的文档(但包含一些示例):http://ss64.com/bash/set.html,该命令help set给出了该信息的摘要。

因此,您描述的行为确实是正确的。我同意,如果有一个选项就好了--help;通常,当man setapropos setwhich set和都whatis set无济于事时,我会尝试将其--help作为选项传递。这样做可以防止命令运行时产生意外结果,因为它会给我一个帮助消息,或者触发错误。在这种情况下:

$ set --help
bash: set: --: invalid option
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

我发现这个技巧是一个有用的安全措施。

我应该指出的是,在 Google 上搜索“bash set”的前几个搜索结果让我找到了这个文档。

答案3

尝试运行set | more并观察第一个屏幕的底部。您可能会看到类似以下内容:

SSH_CLIENT='XXX.XXX.XXX.XXX 54284 22'
SSH_CONNECTION='XXX.XXX.XXX.XXX 54284 68.232.126.14 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=114
USER=XXXXXXX
XDG_SESSION_COOKIE=740274408c1d635200f7415f00000009-1329686026.470247-1256968508
_=
__grub_script_check_program=grub-script-check
_scp_path_esc='[][(){}<>",:;^&!$=?`|\\'\''[:space:]]'
__expand_tilde_by_ref ()
{
    if [ "${!1:0:1}" = "~" ]; then
        if [ "${!1}" != "${!1//\/}" ]; then
...output truncated...       

因此,您所指的脚本是一个巧妙(如果不是很清楚)转义的 shell 变量。至于waittesttrue。这些都在手册页中记录。问题man <command>以了解有关它们的更多信息。空白输出是这些函数的预期结果。

相关内容