command_not_found_handler无法在mac中工作

时间:2014-12-18 21:14:23

标签: linux macos bash shell command-line

所以我在.bashrc文件中有这个bash代码...我正在使用Mac OS X Yosemite

command_not_found_handle () 
{ 
    runcnf=1;
    retval=127;
    [ ! -S /var/run/dbus/system_bus_socket ] && runcnf=0;
    [ ! -x /usr/libexec/packagekitd ] && runcnf=0;
    if [ $runcnf -eq 1 ]; then
        /usr/libexec/pk-command-not-found $@;
        retval=$?;
    else
        echo "lalalla";
        retval=1;
    fi;
    return $retval
}

我之前在linux环境中使用过这段代码,它运行得很好......每当用户输入一个不存在的bash命令时,它会默认回显“lalalal”.....但是当我在我的Mac OS X Yosemite上使用它,尽管我的.bashrc文件已正确注册(我执行source ~/.bash_profile而我的.bash_profile包含代码source ~/.bashrc

我的.bashrc中存在的其他命令正在执行....

我做错了什么?当用户输入mac中不存在的命令时,如何让mac使用command_not_found_handle?

更新

@tristan所以我通过brew升级了bash,当我运行bash --version输出时确认了

GNU bash, version 4.3.30(1)-release (x86_64-apple-darwin14.0.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

此外我重做了源.bash_profile

但是当我输入一个不存在的命令时,它仍会显示

-bash: askldfasf: command not found

我做错了什么?

1 个答案:

答案 0 :(得分:2)

command_not_found_handle被引入Bash第4版。

OS X Yosemite默认附带bash-3.2。

为了介绍一些传真,您可以检查每个命令的退出代码以查找退出代码127(“未找到命令”)并在之后追加对该函数的调用。您可以通过检查先前命令的退出代码是127并调用自定义command_not_found_handle函数(使用$?和PROMPT_COMMAND)来自行修补此行为。

那就是说,如果我在你的位置,我可能会通过homebrewbrew install bashsource安装Bash来升级Bash。

e.g。

bash-4.3$ cat not_found.bash
command_not_found_handle()
{
        echo ":("
}
bash-4.3$ source not_found.bash
bash-4.3$ a
:(

我测试了你的脚本,因为它目前也在我的机器上:

bash-4.3$ source pillar.bash
bash-4.3$ a
lalalla

以交互方式测试source - 确保您的脚本在您的计算机上是相同的。