Bash 中的错误消息结构

Bash 中的错误消息结构

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

有关的:

相关内容