从 bash 完成中隐藏一些命令?

nei*_*zod 10 bash autocomplete

在 bash 中,假设我有这些命令:

$ pyt[TAB][TAB]
pytest
python
python-config
python-dbg
Run Code Online (Sandbox Code Playgroud)

99% 的情况下,我会选择python. 它是如此恼人的是pytest弹出,并阻止我打字只pyt[TAB][RETURN]调用python。我可以隐藏pytestbash 完成吗?

我的限制:

  1. 我知道我可以删除pytest二进制文件/usr/bin/pytest以防止在 bash 中出现该建议。但是如果我没有 root 访问权限怎么办?如果pytest一个重要的脚本必须存在才能让其他脚本正常工作怎么办?

  2. 即使我可以删除pytest二进制文件(我以前也这样做过),但有时当我升级我的软件时,这个脚本又回来了。

  3. 我知道我可以使用 analias来保存我最喜欢的应用程序的击键(也许只是p为了python)。但我不喜欢这些非标准的缩写。当我远程连接到其他机器时,这让我感到困惑。

那么,有没有办法在 bash 完成中隐藏一些命令?欢迎使用其他 shell(zsh、fish 等)的答案,因为 bash 最近没有加快我的工作流程。

zua*_*azo 15

这是相当新的,但在Bash 4.4 中你可以设置EXECIGNORE变量:

aa. 新变量:EXECIGNORE;以冒号分隔的模式列表,在搜索命令时将导致忽略匹配的文件名。

官方文档

执行者

以冒号分隔的 shell 模式列表(请参阅模式匹配),定义了使用 PATH 进行命令搜索时要忽略的文件名列表。出于通过 PATH 查找完成和命令执行的目的,其完整路径名与这些模式之一匹配的文件不被视为可执行文件。这不会影响 [、test 和 [[] 命令的行为。命令哈希表中的完整路径名不受 EXECIGNORE 的约束。使用此变量可忽略设置了可执行位但不是可执行文件的共享库文件。模式匹配遵循 extglob shell 选项的设置。

例如:

$ EXECIGNORE=$(which pytest)
Run Code Online (Sandbox Code Playgroud)

或使用模式匹配

$ EXECIGNORE=*/pytest
Run Code Online (Sandbox Code Playgroud)