Bash

如何通過 bash 中的自動完成將 cd 放入唯一的子文件夾?

  • June 21, 2021

我正在使用 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 extglobshopt -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

它解決了我的問題。謝謝你們!

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