我正在使用 Centos 7 和 bash。我知道在某些机器上,如果当前文件夹中只有一个子文件夹(和一些文件),当您键入时cd <tab>
它会自动完成子文件夹的名称。但是,它在我的计算机上不起作用,尽管<tab>
可以在我的计算机上执行其他自动完成功能,例如,less ab<tab>
将自动完成以 开头的文件名ab
。我该如何修复它?
编辑:
另一台工作机有相同的 Centos 和 bash。在我的机器上,cd <tab>
除了嘟嘟声之外什么也没做。对于cd <tab><tab>
,它显示当前文件夹中的所有文件和单个子文件夹。两台机器上的单个文件夹都是正确的(命令ls -ld the_single_folder
显示drwxrwxr-x 2 user user ...
)。
一些 shell 选项(命令的输出shopt
)是不同的。的输出diff shoptA shoptB
是(我的机器是B):
18c18
< extglob on
---
> extglob off
27c27
< hostcomplete off
---
> hostcomplete on
42a43
> syslog_history off
shopt -s extglob
我尝试使用命令和来更改我的计算机上的这些不同选项(extglob 和 hostcomplete)shopt -u hostcomplete
。但没有成功
命令complete -p cd
在那台机器上输出complete -o nospace -F _cd cd
,在我的机器上输出-bash: complete: cd: no completion specification
。
type _cd
该机器上的命令输出:
_cd is a function
_cd ()
{
local cur prev words cword;
_init_completion || return;
local IFS='
' i j k;
compopt -o filenames;
if [[ -z "${CDPATH:-}" || "$cur" == ?(.)?(.)/* ]]; then
_filedir -d;
return 0;
fi;
local -r mark_dirs=$(_rl_enabled mark-directories && echo y);
local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y);
for i in ${CDPATH//:/'
'};
do
k="${#COMPREPLY[@]}";
for j in $( compgen -d $i/$cur );
do
if [[ ( -n $mark_symdirs && -h $j || -n $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then
j+="/";
fi;
COMPREPLY[k++]=${j#$i/};
done;
done;
_filedir -d;
if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
i=${COMPREPLY[0]};
if [[ "$i" == "$cur" && $i != "*/" ]]; then
COMPREPLY[0]="${i}/";
fi;
fi;
return 0
}
答案1
下列的链接在@卡米尔·马乔罗夫斯基的建议,我通过命令安装了一个包
yum --enablerepo=epel install bash-completion-extras
它解决了我的问题。谢谢你们!