1

通常、環境変数にはディレクトリ リストがあり、( など) で区切られてい:ます。$PATH$LD_LIBRARY_PATH

リスト内の各ディレクトリにコマンドを適用するツールまたは標準的な方法はありますか?

私の場合、それらが存在するかどうかを確認する必要がありますが、他の多くのコマンドも便利なので、それらのリストを簡単に反復する方法を探しています。

4

4 に答える 4

4

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.

于 2013-09-26T18:50:44.333 に答える
2

さて、私がする簡単なことは

echo $PATH | tr : '\n' | while read dir; do
  ls "$dir" > /dev/null
done

コンポーネントが存在しない (または読み取れない) 場合は、エラーが発生します。おそらく防弾ではない。

于 2013-09-26T18:39:18.607 に答える
1

あなたがすることができます:

$ 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
于 2013-09-26T18:41:40.730 に答える
0

位置パラメーターを利用することもできます。

IFS=:
set -- $PATH
for dir in "$@"; do
    : do something with "$dir"
done

for ループをより簡潔に記述して、位置パラメーターをループすることもできます。

for dir; do ...

スクリプトで他に行うことによっては、上書きする前に現在の IFS を保存する必要がある場合があります。

oldIFS=$IFS
IFS=:
# ...
于 2013-09-26T19:35:55.047 に答える