对于以dot开头的不存在的命令,Bash不会打印任何错误信息

时间:2015-12-16 10:08:57

标签: linux bash

这真的只是出于好奇。

一个错字让我注意到在Bash,以下内容:

$ .anything

不会打印任何错误("任何"不能按字面解释,它实际上可以是任何东西,并且在点之后没有空格)。

我很好奇这是如何在bash中解释的。

请注意,echo $?在此类命令后返回127.这通常意味着找不到"命令"。在这种情况下它确实有意义,但是我发现很奇怪没有打印错误信息。

为什么$ anything实际打印bash:anything: command not found...(假设PATH中没有anything cmd),而$ .anything默默地滑过?

系统:Fedora Core 22

Bash版本:GNU bash,版本4.3.39(1)-release(x86_64-redhat-linux-gnu)

编辑:

下面的一些评论表明该问题最初是不可复制的。

以下@ hek2mgl的答案总结了对这个问题的许多贡献,最终发现(由@n.m。)在FC22中可重现并在https://bugzilla.redhat.com/show_bug.cgi?id=1292531中作为错误报告提交

1 个答案:

答案 0 :(得分:3)

bash支持无法找到命令时的处理程序。您可以定义以下功能:

function command_not_found_handle() {
    command=$1
    # do something
}

使用该功能可以抑制错误消息。在bash启动文件中搜索该功能。

找到它的另一种方法是取消设置功能。像这样:

$ unset -f command_not_found_handle
$ .anything # Should display the error message

经过一番研究,@ n.m。发现所描述的行为是出于意图。 FC22实现command_not_found_handle并调用程序/etc/libexec/pk-command-not-found。该程序是PackageKit项目的一部分,如果您键入无法找到的命令名,将尝试建议可安装程序包。

在它的main()函数中,程序显式检查命令名称是否以点开头并在这种情况下以静默方式返回。此提交中引入了此行为:

https://github.com/hughsie/PackageKit/commit/0e85001b

作为对此错误报告的回复:

https://bugzilla.redhat.com/show_bug.cgi?id=1151185

恕我直言,这种行为值得怀疑。至少其他发行版没有这样做。但现在您知道该行为是100%可重现的,您可以跟进该错误报告。