Ubuntuで、すべてのディレクトリのすべての実行可能ファイルを変数として表示するスクリプトを作成したいと思います$PATH
。これは私のスクリプトです。
#!/bin/bash
IFS=:
for dir in $PATH;do
echo $dir:
for files in $dir/*;do
b=$(basename $files)
[ -x "$b" ] && echo $" $b"
done
done
しかし、出力は
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin:
/usr/games:
/usr/local/games:
/snap/bin:
/home/sudin/programming/shell:
brightness
for
ifthen
loop
mat2
myfind
searchex
他のディレクトリの実行可能ファイルがリストされないのはなぜですか?
答え1
そして
[ -x "$b" ]
その名前のファイルがに保存されているかどうかをテストしています$b
。いいえPATH
パスは実行可能ファイルなので、スクリプトは現在のディレクトリの実行可能ファイルと一致するもののみを検索します。
フルパスをテストすると問題が解決します。
[ -x "$files" ] && printf " %s\n" "$b"
その間、引用文を修正してみましょう。
#!/bin/bash
IFS=:
for dir in $PATH;do
printf "%s:\n" "$dir"
for files in "$dir"/*;do
b="$(basename "$files")"
[ -x "$files" ] && printf " %s\n" "$b"
done
done
バラよりシェルで知られているすべてのコマンドのリストより包括的なソリューションのために、空のアイテムPATH
、グローブ、およびディレクトリを含む無効な形式のアイテムを処理します。