Bash劫持cd命令專用函數(shù),提供交互式選擇輸入序號(hào)即可快速cd切換到子目錄
使用方法:
將以下函數(shù)代碼加入個(gè)人配置文件(~/.bash_profile或~/.bashrc)即可,輸入cd命令直接回車,即出現(xiàn)子目錄選擇列表,輸入序號(hào)即可cd到對(duì)應(yīng)的子目錄;
經(jīng)測(cè)試,Cygwin和Linux服務(wù)器均可使用;
使用場(chǎng)景:用手機(jī)終端軟件(如
JuiceSSH、ConnectBot等)連接SSH遠(yuǎn)程服務(wù)器時(shí),不方便鍵入中文或無法輸入中文的情況下極為有用;
Shell源代碼
_hook-cd() {
#劫持cd命令,方便在手機(jī)終端不方便打漢字的情況下切換目錄
[ $# -gt 0 ] && \cd "$@" && return
[[ "$-" != *i* ]] && \cd "$@" && return #非交互式會(huì)話操作直接返回
[ -z "$SSH_TTY" ] && \cd "$@" && return #如果是本地終端窗口,不是SSH遠(yuǎn)程會(huì)話連接,則不做任何修改
#echo "創(chuàng)建交互式選擇列表..."
print_color 40 "請(qǐng)選擇要切換到的子目錄..."
local subDirs=$(\ls -F|grep '/$'|tr '\t' '\n')
local toDir
echo "$subDirs"|awk '{print NR" ):"$0}'
while :;
do
read -p "請(qǐng)輸入序號(hào)選擇要切換到的目錄(輸入 0 或 q 退出操作):" toDir
if [[ "${toDir,,}" == "0" || "${toDir,,}" == "q" ]];then
print_color 40 "退出操作..."
return
elif [ -z "$toDir" ];then
print_color 40 "選擇為空,退出操作..."
return
else
#echo "你選擇了 $toDir..."
toDir=$(echo "$subDirs"|awk 'NR=='"$toDir"'{print $0;exit}' 2>/dev/null)
[ ! -z "$toDir" ] && break
print_color 40 "選擇無效,請(qǐng)重新選擇...."
fi
done
echo "切換到目錄 $toDir ..."
#---------------------------------------
#_T="`realpath $toDir`" ASMyBash=true exec bash --login -i # <--- 此行會(huì)fork一個(gè)子進(jìn)程以取代當(dāng)前進(jìn)程~作用與cd xxx相同,但會(huì)產(chǎn)生額外內(nèi)存開銷,可用于應(yīng)對(duì)其他復(fù)雜情況
#---------------------------------------
\cd "$toDir"
}
[ ! -z "$SSH_TTY" ] && alias cd='_hook-cd' #只有在遠(yuǎn)程終端連接的情況下才劫持cd命令
運(yùn)行截圖:

718c715ebe53a0b841a308fc4657df54_176373-20221209163258607-1805682514.png