これが私が今まで持っているものです:
#!/bin/bash
for file in $PATH ; do # Scanning files in $PATH
if [ -x ] ; then #Check if executable
echo "Executable File"
else
echo "Not executable"
fi
done
出力は「ファイル実行可能」です。
すべてのフォルダを正しく繰り返さないようです。
答え1
必要なものが実行可能ファイルのリストであれば、find
これで十分です。
IFS=':'
find $PATH -type f '(' -perm -u+x -o -perm -g+x -o -perm -o+x ')'
これはリストされていますフルパスその変数の区切り文字であるコロン$PATH
()で分割するIFS=':'
必要があります。$PATH
:
欲しくないならフルパスしかし、ただ実行ファイル名、することができます
IFS=':'
find $PATH -type f '(' -perm -u+x -o -perm -g+x -o -perm -o+x ')' -exec basename {} \; | sort
システムがfind
GNUと互換性がある場合、条件ははるかに簡単です。
IFS=':'
find $PATH -type f -executable -exec basename {} \; | sort
@StephenHarrisが指摘したように、ここにはいくつかの問題があります。サブディレクトリが存在する場合、$PATH
その$PATH
サブディレクトリのファイルにアクセスできなくても報告されることがあります。この問題を解決するには、実際に必要POSIXに必要なものよりも多くのオプションがありますfind
。この問題に対するGNU準拠のソリューションは次のとおりです。
IFS=':'
find $PATH -maxdepth 1 -type f -executable -exec basename {} \; | sort
これらのサブディレクトリに入らない-maxdepth 1
ように指示します。find
答え2
一方、$PATH
ディレクトリのリストが提供されます。のすべてのファイルを確認するには、のすべての$PATH
項目を確認するのではなく、すべてのディレクトリのすべてのファイルを確認する必要があります$PATH
。
次に、ファイルが実行可能であることを確認するために使用します-x
が、確認するファイルを指定しませんでした。次のように変更されたバージョンを作成しました。
IFS=':'
for directory in $PATH; do
for file in $directory/*; do
if [ -x $file ]; then
echo "Executable File: " $file
else
echo "Not executable: " $file
fi
done
done
Foxの答えはより良い解決策ですが、あなたはあなたの質問に興味があると思いました。
答え3
compgen
特にbashの場合、組み込み機能を利用できます。
compgen -c
Tab利用可能なすべてのコマンド、組み込み機能、関数、エイリアスなどを一覧表示します(デフォルトでは、空のプロンプトでクリックしたときに表示できるもの)。compgen -b
すべての組み込み関数、同様のd
ディレクトリ、f
ファイル、a
エイリアスなどを一覧表示します。
compgen
したがって、次の出力を使用して乱用する可能性がありますwhich
。
$ compgen -c | xargs which -a
/bin/egrep
/bin/fgrep
/bin/grep
/bin/ls
/bin/ping
/usr/bin/time
/usr/bin/[
/bin/echo
/bin/false
/bin/kill
compgen
私の場合、最初の5つは実際にエイリアスマスキングコマンドで、次にキーワードと組み込みコマンドがあるため、出力に順序があるようです。
答え4
IFS=:; set -f;
find -- $PATH -type d -prune -exec sh -c '
cd "$1" && \
find . -type d ! -name . -prune \
-o \
-type f \( -perm -u+x -o -perm -g+x -o -perm -o+x \) -exec echo Executable File: \{\} \; \
-o \
-type f ! -perm -u+x ! -perm -g+x ! -perm -o+x -exec echo Not executable: \{\} \;
' {} {} \;
IFSはコロンに設定されており、PATH区切り文字とglobマッチも無効になり、PATH内の名前のglob文字の分割を防ぎます。
$ PATHは、find
オプションが到着する前に分割され、主要な引数として表示されます。カタログから対応するパラメータのみを選択します。 (dirにも接続するには、-Lオプションを指定してください)。次に、このディレクトリの最初のレベルにドリルダウンして、誰か(たとえば、ユーザー/グループ/その他)が実行できるファイルをインポートします。