我最近从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
=
的短选项是相当不寻常的。通常短选项要么需要第二个参数或-cValue
,而长选项则需要--long-opt=Value
(或第二个参数)。 - Etan Reisner=
。这可能是通用完成问题,也可能是完成未正确调整为您的脚本。我不知道。如果您仍然拥有SL机器,可以在那里检查活动完成情况。 - Etan Reisner