Bash

列出目前 PATH 中的所有文件/二進製文件

  • January 10, 2013

是否有一種“簡單”的方式來執行“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命令,該命令會搜尋簡短描述包含關鍵字的命令的手冊頁。一個限制是這只查找具有手冊頁的命令。

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