命令失败后运行的命令(函数)名称是什么?

命令失败后运行的命令(函数)名称是什么?

运行命令时,如果该命令不存在,则会显示有关该命令失败的一些信息。

我尝试将有关该失败命令的信息作为脚本的输入,该脚本必须在命令失败时自动运行。

每当命令失败时,$?值就会是127。我必须捕获这个失败事件并在那里运行我的命令。

答案1

/etc/bash.bashrc我的(Ubuntu 14.04.4 LTS)中有这个片段:

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
    function command_not_found_handle {
            # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
           /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ];     then
           /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
        else
           printf "%s: command not found\n" "$1" >&2
           return 127
        fi
    }
fi

看起来你应该覆盖这个command_not_found_handle函数。这个包command-not-found不是实现这个功能所必需的。事实上,这就是Bash 参考手册说:

如果名称既不是 shell 函数也不是内置函数,并且不包含斜杠,Bash 会在 的每个元素中搜索$PATH包含该名称的可执行文件的目录。[…] 如果搜索不成功,shell 会搜索名为 的已定义 shell 函数command_not_found_handle。如果该函数存在,则会在单独的执行环境中调用它,并使用原始命令和原始命令的参数作为其参数,并且该函数的退出状态将成为该子 shell 的退出状态。如果该函数未定义,shell 会打印错误消息并返回退出状态127

例子:

function command_not_found_handle { echo BOOM! ; }

结果:

$ foo12345
BOOM!
$ echo "echo is valid command"
echo is valid command
$ agrgokdnlkdgnoajgldfnsdalf grhofhadljh
BOOM!
$ cat /etc/issue
Ubuntu 14.04.4 LTS \n \l

$ catt /etc/issue
BOOM!

恢复(快速而粗略):

# Assuming you haven't modified /etc/bash.bashrc
. /etc/bash.bashrc
# Quick and dirty, because if your ~/.bashrc or ~/.bash_profile //
# overwrites some settings from /etc/bash.bashrc //
# you need to source them again.
# Things may get complicated, I won't cover all the ifs here.
# Logout and login again for the clean start.

修改/etc/bash.bashrc以更改所有用户的“未找到命令”行为。定义您自己的command_not_found_handle~/.bashrc使其仅适用于您。或者编写两个具有适当函数定义的文件以随时启用和禁用您的黑客攻击。重要提示:不要执行这些文件,而是像这样获取它们:

. ~/.hack_enable
. ~/.hack_disable

在哪里.hack_enable定义你的功能,.hack_disable回到原来的功能(从我的答案的第一个代码块或类似的在你的情况下正确的内容)。

答案2

尝试以下脚本:

if command ; then
    echo "Command succeeded"
 else
    echo "Command failed"
fi

这样,您就可以在每种情况下执行您想要的任何代码。

相关内容