Pokaż PATH w sposób czytelny dla człowieka


43

Chcę pokazać moją zmienną środowiskową PATH w sposób bardziej czytelny dla człowieka.

$ 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

Myślę o czymś takim:

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

Odpowiedzi:


62

Możesz użyć 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
...

Możesz to również zrobić w niektórych powłokach (testowane w bash i zsh):

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

W zsh możesz użyć $pathzmiennej, aby zobaczyć swoją ścieżkę ze spacjami zamiast dwukropków.

$ 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

Które można łączyć z printflub 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
...

Te <<<podmioty są nazywane herestrings. Ciągi znaków przekazują słowo po prawej stronie do standardowego wejścia polecenia po lewej stronie.

$ cat <<< 'Hello there'
Hello there

Jeśli twoja powłoka ich nie obsługuje, użyj echoi potoku.

$ echo 'Hello there' | cat
Hello there

2
Interesujące użycie ciągu tutaj, zrobiłbym następujące: echo $PATH | tr ':' '\n'ale bardziej jasne jest twoje rozwiązanie.
Arturo Herrero,

1
Dodałem trochę do mojej odpowiedzi, aby wyjaśnić użycie znaków wszystkim przechodniom.

W Zsh print -l $pathzapisuje kilka naciśnięć klawiszy. Nie udaje się, jeśli $pathzawiera odwrotne ukośniki, ale jest to bardzo nietypowe.
Gilles „SO- przestań być zły”

Zauważ, że niektóre z nich nie wyświetlą pustych pozycji w $PATH.
Stéphane Chazelas,

@StephaneChazelas: Nigdy o tym nie myślałem. Pierwsze dwa wyświetlają puste wpisy. Tylko zsh nie.

4

Oto szybki sposób bash

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

4
Możesz uniknąć zapisywania / przywracania IFSza pomocą podpowłoki. np.(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Nick

1
To również nie wyświetli pustego wpisu w większości pocisków, jeśli jest ostatni ( /bin:/usr/bin:kiedyś była to wspólna wartość $PATH)
Stéphane Chazelas

Może się również nie powieść, jeśli $PATHzawiera znaki wieloznaczne (mało prawdopodobne)
Stéphane Chazelas,

Jak już określiłeś bash, możesz użyć IFS=: read -a arr <<< "$PATH"do podziału części. W ten sposób IFSnowa wartość zostanie wykorzystana tylko podczas wykonywania read, więc nie trzeba jej przywracać. pastebin.com/7E7C4AcR
manatwork

Dziękuję wszystkim za opinie. @manatwork, czy wiesz, dlaczego IFSnowa wartość utrzymuje się po utworzeniu tablicy, ale nie po uruchomieniu read?
iruvar


1

Zauważ, że nieuzbrojona ŚCIEŻKA ma inne znaczenie niż pusta ŚCIEŻKA. Pusta ŚCIEŻKA zawiera jeden pusty element, a to oznacza szukanie plików wykonywalnych tylko w bieżącym katalogu, nieuzbrojona ŚCIEŻKA oznacza wyszukiwanie plików wykonywalnych na domyślnej liście katalogów (należy jednak pamiętać, że w niektórych systemach nie każde narzędzie zgadza się z zawartością ta lista)

W zsh:

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

W powłokach POSIX (zauważ, że zshnawet w shtrybie nie ma pod tym względem POSIX):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.