Zeigen Sie PATH auf eine für Menschen lesbare Weise


43

Ich möchte meine PATH-Umgebungsvariable besser lesbar anzeigen.

$ 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

Ich denke in etwa so:

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

Antworten:


62

Sie können verwenden 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
...

Sie können dies auch in einigen Shells tun (getestet in bash und zsh):

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

In zsh können Sie die $pathVariable verwenden, um Ihren Pfad mit Leerzeichen anstelle von Doppelpunkten anzuzeigen.

$ 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

Welche kann mit printfoder kombiniert werden 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
...

Die <<<Operatoren heißen Herestrings. Herestrings geben das Wort zu ihrer Rechten an die Standardeingabe des Befehls zu ihrer Linken weiter.

$ cat <<< 'Hello there'
Hello there

Wenn Ihre Shell sie nicht unterstützt, verwenden Sie echound eine Pipe.

$ echo 'Hello there' | cat
Hello there

2
Interessant ist die Verwendung des Here-Strings, ich würde folgendes tun: Ist echo $PATH | tr ':' '\n'aber klarer deine Lösung.
Arturo Herrero

1
Ich habe meiner Antwort ein wenig hinzugefügt, um Passanten die Verwendung von Herestrings zu erklären.

print -l $pathSpeichert in zsh einige Tastatureingaben. Es schlägt fehl, wenn $pathBackslashes enthalten sind, aber das ist höchst ungewöhnlich.
Gilles 'SO - hör auf böse zu sein'

Beachten Sie, dass bei einigen von diesen die leeren Einträge in nicht angezeigt werden $PATH.
Stéphane Chazelas

@StephaneChazelas: Daran habe ich nie gedacht. Die ersten beiden zeigen leere Einträge an. Die zsh-only tun das nicht.

4

Hier ist ein schneller Weg mit bash

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

4
Sie können das Speichern / Wiederherstellen vermeiden, IFSindem Sie eine Subshell verwenden. zB(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Nick

1
Außerdem wird in den meisten Shells kein leerer Eintrag angezeigt, wenn es das letzte ist ( /bin:/usr/bin:früher ein allgemeiner Wert für $PATH)
Stéphane Chazelas,

In kann auch fehlschlagen, wenn $PATHeinige Platzhalterzeichen enthalten (unwahrscheinlich)
Stéphane Chazelas

Wie Sie bashohnehin angegeben haben, können Sie IFS=: read -a arr <<< "$PATH"für den Aufteilungsteil verwenden. Auf diese Weise wird IFSder neue Wert nur während der Ausführung von verwendet read, sodass er nicht wiederhergestellt werden muss. pastebin.com/7E7C4AcR
Manatwork

Vielen Dank für das Feedback. @manatwork, wissen Sie, warum IFSder neue Wert nach der Array-Erstellung erhalten bleibt, aber nicht nach der Ausführung read?
Iruvar

2

Aufbauend auf Smith Johns Lösung, das macht für einen schönen Alias in Ihrer .bash_profile:

alias MyPath='echo -e ${PATH//:/\\n}'

1

Beachten Sie, dass ein nicht festgelegter PATH eine andere Bedeutung hat als ein leerer PATH. Ein leerer PFAD enthält ein leeres Element. Das bedeutet, dass nur im aktuellen Verzeichnis nach ausführbaren Dateien gesucht wird. Ein nicht festgelegter PFAD bedeutet, dass in einer Standardliste von Verzeichnissen nach ausführbaren Dateien gesucht wird diese Liste)

In zsh:

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

In POSIX-Shells (beachten Sie, dass zshauch im shModus diesbezüglich kein POSIX vorhanden ist):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.