Afficher PATH de manière lisible par l'homme


43

Je souhaite afficher ma variable d'environnement PATH d'une manière plus lisible par l'homme.

$ 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

Je pense à quelque chose comme ça:

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

Réponses:


62

Vous pouvez utiliser 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
...

Vous pouvez également le faire dans certains shells (testés en bash et zsh):

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

Dans zsh, vous pouvez utiliser la $pathvariable pour voir votre chemin avec des espaces au lieu de deux points.

$ 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

Qui peut être combiné avec printfou 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
...

Les <<<opérateurs s'appellent herestrings. Herestrings passe le mot à leur droite à l'entrée standard de la commande à leur gauche.

$ cat <<< 'Hello there'
Hello there

Si votre shell ne les supporte pas, utilisez echoun tuyau.

$ echo 'Hello there' | cat
Hello there

2
Intéressant l'utilisation de la chaîne ici, je ferais ce qui suit: echo $PATH | tr ':' '\n'mais votre solution est plus claire.
Arturo Herrero

1
J'ai ajouté un peu à ma réponse pour expliquer l'utilisation des herestrings à tous les passants.

En zsh, print -l $pathenregistre quelques frappes. Il échoue si $pathcontient des barres obliques inverses, mais c'est très inhabituel.
Gilles, arrête de faire le mal '20

Notez que certaines d'entre elles ne pourront pas afficher les entrées vides dans $PATH.
Stéphane Chazelas

@ StephaneChazelas: Je n'ai jamais pensé à cela. Les deux premiers affichent des entrées vides. Les seuls zsh ne le font pas.

4

Voici un moyen rapide avec bash

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

4
Vous pouvez éviter de sauvegarder / restaurer IFSen utilisant un sous-shell. par exemple(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Nick

1
Cela échouera également à afficher une entrée vide dans la plupart des coquilles si c'est la dernière ( /bin:/usr/bin:valeur usuelle pour $PATH)
Stéphane Chazelas

In peut également échouer si $PATHcontient des caractères génériques (peu probable)
Stéphane Chazelas

Comme vous l'avez de bashtoute façon spécifié , vous pouvez utiliser IFS=: read -a arr <<< "$PATH"pour la division. La IFSnouvelle valeur de cette manière ne sera utilisée que lors de l'exécution de la read, inutile donc de la restaurer. pastebin.com/7E7C4AcR
manatwork le

Merci à tous pour les commentaires. @ manatwork, savez-vous pourquoi IFSla nouvelle valeur persiste après la création du tableau, mais pas après son exécution read?
iruvar


1

Notez qu'un PATH non défini a une signification différente d'un PATH vide. Un PATH vide contient un élément vide, ce qui signifie que vous recherchez des exécutables dans le répertoire actuel uniquement. Un PATH non défini signifie rechercher des exécutables dans une liste de répertoires par défaut (notez que sur certains systèmes, tous les outils ne s'accordent pas sur le contenu cette liste)

Dans zsh:

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

Dans les shells POSIX (notez que zshmême en shmode, ce n'est pas POSIX à cet égard):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.