PATH'i insan tarafından okunabilir bir şekilde gösterme


43

PATH ortam değişkenimi daha okunaklı bir şekilde göstermek istiyorum.

$ 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

Bunun gibi bir şey düşünüyorum:

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

Yanıtlar:


62

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

Bunu bazı kabuklarda da yapabilirsiniz (bash ve zsh ile test edilmiştir):

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

Zsh'de $pathyolunuzu iki nokta yerine boşluk bırakarak görmek için değişkeni kullanabilirsiniz .

$ 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

Hangi ile kombine edilebilir printfya 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
...

<<<Operatörler denilen herestrings vardır. Herestrings kelimeyi sol tarafındaki standart komut girişine sağa iletir.

$ cat <<< 'Hello there'
Hello there

Eğer kabuğunuz onları desteklemiyorsa, echobir boru kullanın .

$ echo 'Hello there' | cat
Hello there

2
Here-string kullanımıyla ilginç olarak aşağıdakileri yaparım: echo $PATH | tr ':' '\n'fakat çözümünüz daha açıktır.
Arturo Herrero

1
Hereste kullanımını yoldan geçenlere açıklamak için cevabımı biraz ekledim.

Zsh ile print -l $pathbirkaç tuş vuruşunu kaydeder. $pathTers eğik çizgiler içeriyorsa başarısız olur , ancak bu oldukça sıra dışı bir durumdur.
Gilles 'SO- kötülük olmayı bırak'

Bunların bazılarının boş girişleri göstermede başarısız olacağını unutmayın $PATH.
Stéphane Chazelas

@StephaneChazelas: Bunu hiç düşünmedim. İlk iki ekranda boş girişler var. Sadece zsh olanlar yok.

4

İşte hızlı bir yol bash

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

4
IFSBir alt kabuk kullanarak kaydetmekten / geri yüklemekten kaçınabilirsiniz . örneğin(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Nick

1
Son ise bu aynı zamanda en kabuklarda boş girişi görüntülemek için başarısız olur ( /bin:/usr/bin:için ortak bir değerdir olarak kullanılan $PATH)
Stéphane Chazelas

$PATHBazı joker karakterler içeriyorsa da başarısız olabilir (düşük olasılıkla)
Stéphane Chazelas 20:13

bashYine de belirttiğiniz gibi IFS=: read -a arr <<< "$PATH", bölme kısmı için kullanabilirsiniz . Bu şekilde IFSyeni değer yalnızca çalıştırılırken kullanılacaktır read, bu nedenle geri yüklemeye gerek yok. pastebin.com/7E7C4AcR
manatwork

Tüm geri bildirimleriniz için teşekkürler. @manatwork, IFSdizi yarattıktan sonra neden yeni değerin devam ettiğini biliyorsunuz, ancak çalıştırdıktan sonra değil read?
iruvar,


1

Belirsiz bir PATH'ın boş bir PATH'den farklı bir anlamı olduğunu unutmayın. Boş bir PATH, bir boş öğe içerir ve bu, yalnızca geçerli dizindeki yürütülebilir dosyaları aramak anlamına gelir; belirsiz bir PATH, varsayılan dizin listesindeki yürütülebilir dosyaları aramak anlamına gelir (ancak bazı araçlarda, her aracın içeriğini kabul etmediğini unutmayın.) bu liste)

İçinde zsh:

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

POSIX kabuklarında (bu modda zshbile shbu konuda POSIX olmadığını unutmayın ):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.