Bashの$ PATHにあるすべての実行可能ファイルをリストするコード行はありますか?
答え1
これは答えではありませんが、実行できるバイナリとコマンドを示しています。
compgen -c
(仮説bash
)
その他の便利なコマンド
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.
答え2
zshを使う:
whence -pm '*'
または:
print -rC1 -- $commands
(複数のコンポーネントに表示されるコマンドの場合、最初のコンポーネントのみが一覧表示さ$PATH
れます。)
完全なパスなしでコマンドを希望し、より良い測定のためにソートするには、次のようにします。
print -rC1 -- ${(ko)commands}
(つまり、対応する連想配列の値ではなくキーを取得します。)
答え3
POSIXシェルでは、最終ソート以外の外部コマンド(printf
フォールバックがない場合は組み込みと仮定)を使用せず、実行可能ファイル名に改行文字が含まれていないとします。echo
{ set -f; IFS=:; for d in $PATH; do set +f; [ -n "$d" ] || d=.; for f in "$d"/.[!.]* "$d"/..?* "$d"/*; do [ -f "$f" ] && [ -x "$f" ] && printf '%s\n' "${f##*/}"; done; done; } | sort
空のコンポーネント$PATH
(.
オーバーライドを使用)、で始まるコンポーネント-
、PATHコンポーネント、または実行可能ファイル名にワイルドカードがなく、で始まる実行可能ファイルがない\[?*
場合は、.
次のように単純化できます。
{ IFS=:; for d in $PATH; do for f in $d/*; do [ -f $f ] && [ -x $f ] && echo ${f##*/}; done; done; } | sort
POSIXを使用しfind
て、次のようにしますsed
。
{ IFS=:; set -f; find -H $PATH -prune -type f -perm -100 -print; } | sed 's!.*/!!' | sort
パスにまれに実行できない場合や、非正規ファイルを一覧表示したい場合は、より簡単な方法があります。
{ IFS=:; ls -H $PATH; } | sort
これはドットファイルをスキップします。必要に応じてその-A
フラグを追加するか(ls
存在する場合)、POSIXを引き続き使用するには、次のようにします。ls -aH $PATH | grep -Fxv -e . -e ..
答え4
私はこれを思い出しました:
IFS=':';for i in $PATH; do test -d "$i" && find "$i" -maxdepth 1 -executable -type f -exec basename {} \;; done
編集する:これは、Apacheユーザーがbinディレクトリ内の特定のファイルを読み取るときにSELinux警告をトリガーしない唯一のコマンドのようです。