当在 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 set
、apropos set
、which 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 变量。至于wait
、test
和true
。这些都在手册页中记录。问题man <command>
以了解有关它们的更多信息。空白输出是这些函数的预期结果。