人間が読める方法でPATHを表示する


43

PATH環境変数をより人間が読める方法で表示したい。

$ echo $PATH
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin:/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin:/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin:/Users/arturo/.rvm/bin:/usr/local/git/bin:/Users/arturo/.gvm/groovy/current/bin:/Users/arturo/.gvm/grails/current/bin:/Users/arturo/.gvm/griffon/current/bin:/Users/arturo/.gvm/gradle/current/bin:/Users/arturo/.gvm/lazybones/current/bin:/Users/arturo/.gvm/vertx/current/bin:/Users/arturo/.gvm/bin:/Users/arturo/.gvm/ext:/usr/local/git/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin

私はこのようなことを考えています:

$ echo $PATH | some cut and awk magic
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/bin
...

回答:


62

を使用できますtr

$ tr ':' '\n' <<< "$PATH"
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
...

いくつかのシェルでこれを行うこともできます(bashとzshでテスト済み):

echo -e ${PATH//:/\\n}

zshでは、$path変数を使用して、コロンではなくスペースでパスを表示できます。

$ echo $path
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin /Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin /Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin /Users/arturo/.rvm/bin

printfまたはと組み合わせることができますprint

$ printf "%s\n" $path
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
...
$ print -l $path
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
...

<<<演算子はherestringsと呼ばれています。ヒアストリングは、右側の単語を左側のコマンドの標準入力に渡します。

$ cat <<< 'Hello there'
Hello there

シェルがそれらをサポートしていない場合はecho、パイプを使用します。

$ echo 'Hello there' | cat
Hello there

2
here-stringの使用に興味があるので、私は次のことをします:echo $PATH | tr ':' '\n'しかし、あなたのソリューションはより明確です。
アルトゥーロエレーロ

1
ヒアストリングの使用を通行人に説明するために、少し答えを追加しました。

zshではprint -l $path、いくつかのキーストロークを保存します。$pathバックスラッシュが含まれていると失敗しますが、それは非常に珍しいことです。
ジル 'SO-悪であるのをやめる'

それらのいくつかはで空のエントリを表示できないことに注意してください$PATH
ステファンシャゼラス

@StephaneChazelas:私はそれについて考えたことがありません。最初の2つは空のエントリを表示します。zsh専用のものはそうではありません。

4

ここに簡単な方法があります bash

OLDIFS=$IFS IFS=: arr=($PATH) IFS=$OLDIFS
printf "%s\n" "${arr[@]}"

4
IFSサブシェルを使用すると、保存/復元を回避できます。例(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
ニック

1
それはまた、(最後だ場合、ほとんどのシェルで空のエントリを表示するために失敗する/bin:/usr/bin:ための共通の値にするために使用$PATH
ステファンChazelas

$PATHいくつかのワイルドカード文字が含まれていると(失敗する可能性があります)
ステファンシャゼル

bashとにかく指定したようIFS=: read -a arr <<< "$PATH"に、分割部分に使用できます。その方法IFSの新しい値はの実行中にのみ使用されるreadため、復元する必要はありません。pastebin.com/7E7C4AcR
manatwork

フィードバックをありがとう。@manatwork、IFS配列の作成後、新しい値が実行後ではなく保持される理由を知っていますかread
iruvar


1

未設定のPATHは、空のPATHとは異なる意味を持つことに注意してください。空のPATHには1つの空の要素が含まれます。これは、現在のディレクトリでのみ実行可能ファイルを検索することを意味します。そのリスト)

zsh

if (($+PATH)); then
  echo "$#path element(s):"
  printf '%q\n' "$path[@]"
else
  echo "PATH unset"
fi

POSIXシェルの場合(その点zshで、shモードであってもPOSIXではないことに注意してください):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.