Bash
列出目前 PATH 中的所有文件/二進製文件
是否有一種“簡單”的方式來執行“ls -la”風格的命令來列出目前 PATH 中的所有文件/可執行二進製文件?
(我打算將輸出通過管道傳輸到 grep 中,以查找具有未知前綴但基本上已知“名稱”的命令,這種情況下 bash 中的自動完成/製表符基本上是無用的。所以某種“反向自動”完整的功能”…)
compgen -c # will list all the commands you could run. compgen -a # will list all the aliases you could run. compgen -b # will list all the built-ins you could run. compgen -k # will list all the keywords you could run. compgen -A function # will list all the functions you could run. compgen -A function -abck # will list all the above in one go.
這是一個列出目錄內容的函式
$PATH
。如果傳遞參數,該函式僅列出名稱包含參數之一的命令。參數被解釋為全域模式。shopt -s extglob lspath () { local IFS pattern IFS='|' pattern="*@($*)*" IFS=':' for d in $PATH; do for x in "$d/"$pattern; do [ "$x" = "$d/$pattern" ] || echo "${x##*/}" done done | sort -u }
像許多事情一樣,這在 zsh 中更容易。
lspath () { (($#)) || set '' print -lr -- $^path/*$^@*(N:t) | sort -u }
參數擴展中的
^
字元導致與數組連接的文本被添加到每個數組元素,例如prints 。看起來像漫畫書的侮辱,但實際上是普通字元,萬用字元,帶有修飾符的特殊參數(位置參數數組) ,以及。是glob 限定符,如果沒有匹配項,則獲得空擴展,後跟歷史修飾符以僅保留每個匹配項的基本名稱(“tail”)。path=(/bin /usr/bin); echo $^path/foo``/bin/foo /usr/bin/foo
/*$^@*``/``*``$@``^``*
(N:t)
N
t
更神秘的是,避免了外部呼叫,但這只是為了美觀:
lspath () { (($#)) || set '' local names; names=($^path/*$^@*(N:t)) print -lr -- ${(ou)names} }
實際上,您可能正在尋找該
apropos
命令,該命令會搜尋簡短描述包含關鍵字的命令的手冊頁。一個限制是這只查找具有手冊頁的命令。