当我输入(in bash
)一个 linux 找不到的命令时,它通常会执行如下操作:
$ x
x: command not found
但是当我输入一个未找到但在某种意义上与其他可能的命令相似的命令时,回复可能如下所示:
$ pyp
No command 'pyp' found, did you mean:
Command 'pcp' from package 'pcp' (universe)
Command 'pype' from package 'pype' (universe)
Command 'pgp' from package 'pgpgpg' (universe)
Command 'pp' from package 'libpar-packer-perl' (universe)
Command 'php' from package 'php5-cli' (main)
Command 'gyp' from package 'gyp' (universe)
Command 'pip' from package 'python-pip' (universe)
Command 'pap' from package 'netatalk' (universe)
pyp: command not found
这意味着在使用进行回复pyp
之前,某些钩子进行了检查。bash
pyp: command not found
我想写一个这样的钩子,它将检查“命令”是否是当前存储库中分支的名称(如果我们确实在存储库中),并在回复之前尝试签出它command not found
,但前提是确实没有找到该命令。
为此,我需要了解一些有关流程的知识;当我输入命令(并按 Enter 键)时,它会转到哪里?回复“你的意思是”的程序是什么?它如何从 bash 获取命令字符串?
答案1
您必须替换/更改command_not_found_handle
shell 函数:
type command_not_found_handle
答案2
该command-not-found
软件包负责 Debian 和 Ubuntu 中的这种行为。不过,不需要定义您自己的处理程序。您可以command_not_found_handle
按如下方式使用:
command_not_found_handle() {
if [ -d .git ] || git rev-parse --is-git-dir 2>/dev/null; then
git checkout "$1" 2>/dev/null
else
printf '%s: %s: command not found\n' "$0" "$1"
return 127
fi
}
抑制消息,例如您的分支是最新的“origin/master”。,使用&>
而不是2>
:git checkout "$1" &>/dev/null
。
例子
nyuszika7h@cadoth ~ > master
-bash: master: command not found
127 nyuszika7h@cadoth ~ > cd src/github/nyuszika7h/Limnoria/
nyuszika7h@cadoth ~/src/github/nyuszika7h/Limnoria master > testing
Your branch is up-to-date with 'origin/testing'.
nyuszika7h@cadoth ~/src/github/nyuszika7h/Limnoria testing > foobar
-bash: foobar: command not found
127 nyuszika7h@cadoth ~/src/github/nyuszika7h/Limnoria testing >