在参数之后使用Bash Tab键自动完成文件名

8

我最近从Scientific Linux 6迁移到CentOS 7,在新的操作系统中遇到了bash tab自动补全的问题。

软件版本

$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

$ uname -r
3.10.0-229.14.1.el7.x86_64

$ bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)

我将翻译成中文:

我有一个名为./run_prog.sh的bash脚本(可执行文件),可以使用-c选项(或长的--config =)在命令行上接受配置文件。

完整命令的示例:

./run_prog.sh -c=./config/test-new-feature.conf
## or
./run_prog.sh --config=./config/test-new-feature.conf

在以前的bash版本中,我能够在-c=结构后使用Tab键自动完成目录和文件名。
期望的Tab键自动完成示例(在SL6中的工作方式):
./run_prog.sh -c=./conf[TAB]
 ## completes to
./run_prog.sh -c=./config/
 ## then type
./run_prog.sh -c=./config/test-n[TAB]
 ## completes to
./run_prog.sh -c=./config/test-new-feature.conf

在CentOS 7中,bash的新版本无法在 -c= 短选项后自动完成任何文件名。

以下是在CentOS 7中出现自动补全问题的示例:

./run_prog.sh -c=./conf[TAB]
 ## doesn't complete anything
./run_prog.sh -c=./conf

然而,如果我在-c和文件名之间加一个空格,则文件名补全会按预期工作。
带空格的工作示例:
./run_prog.sh -c ./conf[TAB]
 ## completes to
./run_prog.sh -c ./config/
 ## then type
./run_prog.sh -c ./config/test-n[TAB]
 ## completes to
./run_prog.sh -c ./config/test-new-feature.conf

问题

如何获得新版本的Bash来像旧版本的Bash一样使用tab键补全文件名?

编辑

这个脚本有一个短选项-c的长版本,即--config。但是长版本也不起作用。

./run_prog.sh --config=./conf[TAB]
 ## doesn't complete anything
./run_prog.sh --config=./conf

这让我想到bash在选项开关(-c)和选项值之间缺少空格时会感到困惑。
我的旧bash-completion目录。
$ ls -1 /media/old_hd/etc/bash_completion.d/
bzr
createrepo.bash
dkms
fcoeadm
fcoemon
gdbus-bash-completion.sh
git
gvfs-bash-completion.sh
lldpad
lldptool
perf
phoronix-test-suite
pk-completion.bash
rpmdevtools.bash-completion
subversion
yum.bash
yum-utils.bash

我的新的bash_completion目录

$ ls -1 /etc/bash_completion.d/
createrepo
dkms
fcoeadm
fcoemon
genpkgmetadata.py
git
lldpad
lldptool
mergerepo
mergerepo.py
modifyrepo
modifyrepo.py
redefine_filedir
scl.bash
yum
yummain.py
yum-utils.bash

1
我没有对这个问题的答案,但我想提一下,一个带有 = 的短选项是相当不寻常的。通常短选项要么需要第二个参数或 -cValue,而长选项则需要 --long-opt=Value(或第二个参数)。 - Etan Reisner
你尝试过比较两个版本之间的bash自动补全版本/代码吗? - Etan Reisner
@EtanReisner 我尝试了-c./con[TAB]和--config=./con[TAB],但都没有起作用。这让我觉得是bash在选项开关和值之间缺少空格时感到困惑。我已经更新了原始问题以反映这一点。 - nick
哦,当然,我的意思不是你选择尝试的问题。我只是指出这是一种不寻常的参数格式,需要使用/支持/期望工作。完成绝对有问题,并且显然没有按照您想要的方式拆分=。这可能是通用完成问题,也可能是完成未正确调整为您的脚本。我不知道。如果您仍然拥有SL机器,可以在那里检查活动完成情况。 - Etan Reisner
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - nick
1个回答

9

经过谷歌搜索和朋友的帮助,我已经找到了解决方案!

为了修复文件名自动完成问题,请将以下内容添加到您的~/.bashrc文件中:

complete -D -o default

参考资料: Bash命令补全:带有等号的参数路径


它在Ubuntu 18.04上不起作用。 - Wilson Freitas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接