Bash 错误消息有时带有-bash:
或bash:
前缀,有时没有。
考虑来自 Ubuntu 14.04.5 Trusty Tahr 和 bash 4.3.11(1) 的这些错误消息
$ type encabulator
-bash: type: encabulator: not found
$ encabulator
encabulator: command not found
$ bash -c encabulator
bash: encabulator: command not found
在另一个问题,有人报告看到一条消息
-bash: fetch: command not found.
当“fetch”只是一个尚未安装的程序时,它与预期的模式不匹配。
在下面的评论之后,我尝试在 Centos 5.7 上使用 bash 3.2.25(1) - 其行为略有不同
$ type encabulator
-bash: type: encabulator: not found
$ encabulator
-bash: encabulator: command not found
$ bash -c encabulator
bash: encabulator: command not found
因此,我猜测另一个问题的信息恰恰是我在使用 bash 4.3.11 进行测试之前首先想到的,这让我感到困惑。
但问题依然没有得到解决:bash 维护者是否有意对这些文本消息的结构应用某种一致的系统?
bash 何时在错误消息前加上前缀-bash:
,何时加上bash:
(前导连字符表示什么?)
我无法通过简单的搜索找到答案,man bash
但也许有一个部分提供了解释?
答案1
什么时候 bash 会在错误消息前加上前缀
-bash:
,什么时候加上bash:
如果打印前缀,通常是 bash 的启动名称,又名argv[0]
(通常可用$0
)。
$ bash -c 'type foo; echo $0'
bash: line 0: type: foo: not found
bash
$ ARGV0=bar bash -c 'type foo; echo $0'
bar: line 0: type: foo: not found
bar
$ ARGV0='¯\(°_o)/¯' bash -c 'type foo; echo $0'
¯\(°_o)/¯: line 0: type: foo: not found
¯\(°_o)/¯
(这使用zsh 的特殊 ARGV0 变量设置argv[0]
我们想要的命令。
要将 bash 作为登录 shell 启动,启动 bash 的任何程序都可以以argv[0]
为前缀-
,或者使用-l
选项。请参阅调用 Bash:
登录 shell 是参数零的第一个字符为 '
-
' 的 shell,或者是使用--login
选项调用的 shell。
例如,
$ ARGV0=-bash bash -c 'echo -n $0:;shopt -q login_shell && echo login || echo not login'
-bash:login
$ bash -c 'echo -n $0:;shopt -q login_shell && echo login || echo not login'
bash:not login
SSH、sudo
(带-i
)、TTYlogin
命令等通常使用前导-
方法来启动登录 shell。因此,如果您通过其中任何一个登录,您可能会看到-bash
(或-zsh
、或-tcsh
,或登录 shell 前面的任何内容-
)。如果您通过终端仿真器启动 bash,它们通常会运行非登录 shell,您会看到bash
。
前面的连字符表示什么?
它可能是一个登录 shell,这在调试中可能很有用。特别是,PATH
通常从登录 shell 提供的文件中设置(/etc/profile
、~/.profile
、~/.bash_profile
等 - 请参阅Bash 启动文件更多信息)。对于命令未找到错误,这尤其重要,因为这PATH
是找到命令的方式。它为您提供了有关应检查哪些文件进行修改的有用信息PATH
。
答案2
bash 何时会在错误消息前加上 -bash: 前缀,何时又加上 bash:
这是任意的。
前面的连字符表示什么?
没什么用。请参阅muru 的回答其中指出连字符表示该错误消息是由登录外壳。
Bash 手册
GNUBash 手册提到 shell 选项
gnu_errfmt
If set, shell error messages are written in the standard GNU error message format.
我尝试设置它,问题中的结果没有变化。
GNU 编码标准
这GNU 编码标准似乎主要关注来自编译器的错误消息(即gcc
?)然而,第 4.4 节说
4.4 Formatting Error Messages
...
... like this:
program: message
when there is no relevant source file.
GNU 库
GNU 的libc 手册给出了生成错误消息的示例。
fprintf (stderr, "%s: Couldn't open file %s; %s\n",
program_invocation_short_name, name, strerror (errno));
exit (EXIT_FAILURE);
从上述文献缺乏细节以及问题中看到的变化来看,我推断前缀的存在或不存在任何特定的含义bash:
。
答案3
添加到muru 的回答argv[0]
,设置sh -c
或的规范方法bash -c
是在命令字符串后提供一个字符串。例如,
$ sh -c '"$@"' mush date +'%B %e'
July 7
$ sh -c '"$@"' mush fig +'%B %e'
mush: fig: command not found
$ sh -c '"$@"' mush type fig
mush: line 0: type: fig: not found
有关的: