在未找到的 bash 命令上陷入 git checkout

在未找到的 bash 命令上陷入 git checkout

当我输入(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之前,某些钩子进行了检查。bashpyp: command not found

我想写一个这样的钩子,它将检查“命令”是否是当前存储库中分支的名称(如果我们确实在存储库中),并在回复之前尝试签出它command not found,但前提是确实没有找到该命令。

为此,我需要了解一些有关流程的知识;当我输入命令(并按 Enter 键)时,它会转到哪里?回复“你的意思是”的程序是什么?它如何从 bash 获取命令字符串?

答案1

您必须替换/更改command_not_found_handleshell 函数:

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 >

来源

zsh - 检查当前目录是否是 Git 存储库 - VoidCC

相关内容