通常、環境変数にはディレクトリ リストがあり、( など) で区切られてい:
ます。$PATH
$LD_LIBRARY_PATH
リスト内の各ディレクトリにコマンドを適用するツールまたは標準的な方法はありますか?
私の場合、それらが存在するかどうかを確認する必要がありますが、他の多くのコマンドも便利なので、それらのリストを簡単に反復する方法を探しています。
通常、環境変数にはディレクトリ リストがあり、( など) で区切られてい:
ます。$PATH
$LD_LIBRARY_PATH
リスト内の各ディレクトリにコマンドを適用するツールまたは標準的な方法はありますか?
私の場合、それらが存在するかどうかを確認する必要がありますが、他の多くのコマンドも便利なので、それらのリストを簡単に反復する方法を探しています。
bash でこれを行う適切な方法は、配列に分割することです。
IFS=: read -ra PATHS <<< "$PATH"
for P in "${PATHS[@]}"; do
echo "$P"
done
この形式を使用すると、ループ内の変数の割り当てが失われます。
echo "$PATH" | tr : '\n' | while read P; do
ALL=$ALL:$P
done
echo "$ALL" # => empty string
それを行うためのもう1つの少し良い方法は、次のとおりです。
while read P; do
ALL=$ALL:$P
done <<< "${PATH//:/$'\n'}"
また、Bash 3.1 を開始すると、ALL=$ALL:$P
さらに簡略化してALL+=$P
.
さて、私がする簡単なことは
echo $PATH | tr : '\n' | while read dir; do
ls "$dir" > /dev/null
done
コンポーネントが存在しない (または読み取れない) 場合は、エラーが発生します。おそらく防弾ではない。
あなたがすることができます:
$ echo $PATH | tr : ' ' | xargs -n1 ls -d
/usr/local/bin
/usr/bin
/bin
/usr/local/sbin
/usr/sbin
/usr/local/sbin
/usr/sbin
ls: cannot access /a/b/c: No such file or directory
存在しないディレクトリのみの場合:
$ echo $PATH | tr : ' ' | xargs -n1 ls -d > /dev/null
ls: cannot access /a/b/c: No such file or directory
位置パラメーターを利用することもできます。
IFS=:
set -- $PATH
for dir in "$@"; do
: do something with "$dir"
done
for ループをより簡潔に記述して、位置パラメーターをループすることもできます。
for dir; do ...
スクリプトで他に行うことによっては、上書きする前に現在の IFS を保存する必要がある場合があります。
oldIFS=$IFS
IFS=:
# ...