bash からアクセスできるシステムで、すべてのプログラム ファイル名を出力しようとしています。(例: パス) 「which $(compgen -c)」を使用していますが、効率的ではないようです。より良い方法はありますか?
1 に答える
0
これはより速いようです:
IFS=: read -ra __ <<< "$PATH"
find "${__[@]}" -mindepth 1 -maxdepth 1 -xtype f -executable
/bin/echo
これは高速ではありませんが、ファイルシステムで見つかったコマンドを正確に出力し、最初に実行される名前に応じて、名前ごとに 1 つのパスのみを出力します/usr/bin/echo
。ファイルシステムで見つかったcompgen -c
ものだけでなく、組み込みコマンドも出力するため、発生する可能性があります。上記のコマンドは、で見つかったすべての実行可能ファイルを出力します。echo
echo
$PATH
type -P $(compgen -c | awk '!a[$0]++')
コマンドにスペースが含まれている場合IFS=$'\n'
は、サブシェルで使用します。
( IFS=$'\n'; type -P $(compgen -c | awk '!a[$0]++'); )
パス名の展開を無効にすることもより安全です。
( IFS=$'\n'; set -o noglob; type -P $(compgen -c | awk '!a[$0]++'); )
同様に配列に保存します。
IFS=$'\n' read -rd '' -a __ < <(compgen -c | awk '!a[$0]++')
type -P "${__[@]}"
于 2013-08-30T23:05:16.117 に答える