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
...

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

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[@]}"

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.