Bash

在 bash 中使用萬用字元自動完成 cd

  • January 30, 2018

在 ubuntu (debian jessie/sid) 上使用 bash 我不知道為什麼我不能使用內置命令對萬用字元進行製表符補全。

例如,假設我目前的工作目錄包含以下子目錄..

% ls -l
drwxr-xr-x 2 userX 4096 2016-08-31 11:46:40 0830a/
drwxr-xr-x 2 userX 4096 2016-08-31 11:46:52 0830b/
drwxr-xr-x 2 userX 4096 2016-08-31 11:47:33 0831a/
drwxr-xr-x 2 userX 4096 2016-08-31 11:47:18 0831b/
drwxr-xr-x 2 userX 4096 2016-08-31 11:50:38 z0830z/

我能打

$$ tab $$輸入’ls -l *31a’並完成後..

ls -l *31a<tab>

完成到..

ls -l 0831a

但是,如果我嘗試使用內置的“cd”命令進行相同操作,它將無法完成..

cd *31a<tab>

..不會完成

此外,使用尾隨萬用字元也會失敗..

cd z*<tab>

..不會完成

有趣的是,沒有萬用字元的補全對於內置函式來說是可以的。例如,我能夠使這個完成工作正常:

cd z<tab>

完成到..

cd z0830z/

此外,我可以按原樣使用“cd *31a”命令並讓它成功(只要它是唯一的)。但我希望擴展發生,所以我確定我要進入什麼。

我的 .inputrc 包含這個..

$if Bash
 Space: magic-space
 set mark-directories on
 set mark-symlinked-directories on
 set completion-ignore-case off
 set show-all-if-ambiguous on
$endif

我沒有 ~/.bash_completion 文件。我確實有 /etc/bash_completion,它只做 /usr/share/bash-completion/bash_completion 的來源。後一個文件有點長,所以我不會在這裡包含它。

我的最終目標是能夠為 cd 命令完成萬用字元完成工作。

我正在與同樣的問題作鬥爭。正如@Gilles 提到的,目前沒有真正的基於 bash 的解決方案。

由於bash-completion並沒有真正添加太多功能cd(AFAIK 僅使用$CDPATH目錄),所以如果您不使用它,那麼您可以將其添加到您的~/.bashrc

compopt -o bashdefault cd

這會將cd完成的行為重置為預設值(萬用字元完成的工作),並且不會更改任何其他內容。

引用自:https://unix.stackexchange.com/questions/307008