0

bash からアクセスできるシステムで、すべてのプログラム ファイル名を出力しようとしています。(例: パス) 「which $(compgen -c)」を使用していますが、効率的ではないようです。より良い方法はありますか?

4

1 に答える 1

0

これはより速いようです:

IFS=: read -ra __ <<< "$PATH"
find "${__[@]}" -mindepth 1 -maxdepth 1 -xtype f -executable

/bin/echoこれは高速ではありませんが、ファイルシステムで見つかったコマンドを正確に出力し、最初に実行される名前に応じて、名前ごとに 1 つのパスのみを出力します/usr/bin/echo。ファイルシステムで見つかったcompgen -cものだけでなく、組み込みコマンドも出力するため、発生する可能性があります。上記のコマンドは、で見つかったすべての実行可能ファイルを出力します。echoecho$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 に答える