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
...
Arturo Herrero
quelle
Cross-Site-Duplikat askubuntu.com/q/600018/295286 und codegolf.stackexchange.com/q/96334/55572
Sergiy Kolodyazhnyy

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

quelle
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[@]}"
iruvar
quelle
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}'
Justin Palmer
quelle
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
Stéphane Chazelas
quelle