Bash
如何通過 bash 中的自動完成將 cd 放入唯一的子文件夾?
我正在使用 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
和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 }
按照@Kamil Maciorowski的建議中的連結,我通過命令安裝了一個包
yum --enablerepo=epel install bash-completion-extras
它解決了我的問題。謝謝你們!