Perlihatkan PATH dengan cara yang bisa dibaca manusia

43

Saya ingin menunjukkan variabel lingkungan PATH saya dengan cara yang lebih bisa dibaca manusia.

$ 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

Saya sedang memikirkan sesuatu seperti ini:

$ 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
...
Arturo Herrero
sumber

Jawaban:

62

Anda bisa menggunakannya 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
...

Anda juga dapat melakukan ini di beberapa shell (diuji dalam bash dan zsh):

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

Di zsh, Anda bisa menggunakan $pathvariabel untuk melihat jalur Anda dengan spasi alih-alih titik dua.

$ 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

Yang dapat dikombinasikan dengan printfatau 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
...

The <<<operator disebut herestrings. Herestrings menyampaikan kata di sebelah kanan mereka ke input standar dari perintah di sebelah kiri mereka.

$ cat <<< 'Hello there'
Hello there

Jika shell Anda tidak mendukungnya, gunakan echodan pipa.

$ echo 'Hello there' | cat
Hello there

sumber
2
Menarik penggunaan string di sini, saya akan melakukan yang berikut: echo $PATH | tr ':' '\n'tetapi solusi Anda lebih jelas.
Arturo Herrero
1
Saya menambahkan sedikit pada jawaban saya untuk menjelaskan penggunaan herestrings pada orang yang lewat.
Di zsh, print -l $pathsimpan beberapa penekanan tombol. Gagal jika $pathmengandung garis miring terbalik, tetapi itu sangat tidak biasa.
Gilles 'SO- stop being evil'
Perhatikan bahwa beberapa di antaranya tidak akan menampilkan entri yang kosong di $PATH.
Stéphane Chazelas
@StephaneChazelas: Saya tidak pernah memikirkan hal itu. Dua tampilan pertama mengosongkan entri. Hanya zsh-only.
4

Inilah cara cepat dengan bash

OLDIFS=$IFS IFS=: arr=($PATH) IFS=$OLDIFS
printf "%s\n" "${arr[@]}"
iruvar
sumber
4
Anda dapat menghindari menyimpan / mengembalikan IFSdengan menggunakan subkulit. misalnya(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Nick
1
Itu juga akan gagal menampilkan entri kosong di sebagian besar shell jika itu yang terakhir ( /bin:/usr/bin:dulu merupakan nilai umum untuk $PATH)
Stéphane Chazelas
In juga dapat gagal jika $PATHberisi beberapa karakter wildcard (tidak mungkin)
Stéphane Chazelas
Seperti yang Anda tentukan bash, Anda dapat menggunakan IFS=: read -a arr <<< "$PATH"untuk bagian pemisahan. IFSNilai baru dengan cara itu hanya akan digunakan saat menjalankan read, jadi tidak perlu mengembalikannya. pastebin.com/7E7C4AcR
manatwork
Terima kasih atas umpan baliknya. @manatwork, tahukah Anda mengapa IFSnilai baru tetap ada setelah pembuatan array tetapi tidak setelah dieksekusi read?
iruvar
2

Memperluas solusi Smith John , ini membuat alias yang bagus di Anda .bash_profile:

alias MyPath='echo -e ${PATH//:/\\n}'
Justin Palmer
sumber
1

Perhatikan bahwa PATH yang tidak disetel memiliki arti yang berbeda dari PATH yang kosong. PATH kosong berisi satu elemen kosong, dan itu berarti mencari executable di direktori saat ini saja, PATH yang tidak disetel berarti mencari executable dalam daftar direktori default (tetapi perhatikan bahwa pada beberapa sistem, tidak setiap alat setuju pada konten dari daftar itu)

Dalam zsh:

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

Dalam shell POSIX (perhatikan bahwa zshbahkan dalam shmode tidak POSIX dalam hal itu):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
Stéphane Chazelas
sumber