Mostra PATH in un modo leggibile dall'uomo


43

Voglio mostrare la mia variabile d'ambiente PATH in un modo più leggibile dall'uomo.

$ 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

Sto pensando a qualcosa del genere:

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

Risposte:


62

È possibile utilizzare 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
...

Puoi anche farlo in alcune shell (testato in bash e zsh):

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

In zsh, puoi usare la $pathvariabile per vedere il tuo percorso con spazi invece di due punti.

$ 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

Che può essere combinato con printfo 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
...

Gli <<<operatori sono chiamati herestrings. Herestrings passa la parola alla sua destra nell'input standard del comando alla sua sinistra.

$ cat <<< 'Hello there'
Hello there

Se la tua shell non li supporta, usa echoe una pipe.

$ echo 'Hello there' | cat
Hello there

2
Interessante l'uso della stringa qui, farei quanto segue: echo $PATH | tr ':' '\n'ma è più chiara la tua soluzione.
Arturo Herrero,

1
Ho aggiunto un po 'alla mia risposta per spiegare l'uso di herestring a tutti i passanti.

In zsh, print -l $pathsalva alcuni tasti. Non riesce se $pathcontiene barre rovesciate, ma è molto insolito.
Gilles 'SO- smetti di essere malvagio' il

Si noti che alcuni di questi non riusciranno a visualizzare le voci vuote in $PATH.
Stéphane Chazelas,

@StephaneChazelas: non ci ho mai pensato. I primi due visualizzano voci vuote. I soli zsh no.

4

Ecco un modo rapido con bash

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

4
È possibile evitare il salvataggio / ripristino IFSutilizzando una subshell. ad es.(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Nick,

1
Anche questo non visualizzerà una voce vuota nella maggior parte delle shell se è l'ultima ( /bin:/usr/bin:utilizzata per essere un valore comune per $PATH)
Stéphane Chazelas,

Può anche fallire se $PATHcontiene alcuni caratteri jolly (improbabile)
Stéphane Chazelas,

Come specificato in bashogni caso, è possibile utilizzare IFS=: read -a arr <<< "$PATH"per la parte di divisione. In questo modo IFSil nuovo valore verrà utilizzato solo durante l'esecuzione di read, quindi non è necessario ripristinarlo. pastebin.com/7E7C4AcR
manatwork

Grazie a tutti per il feedback. @manatwork, sai perché IFSil nuovo valore persiste dopo la creazione dell'array ma non dopo l'esecuzione read?
Iruvar,


1

Si noti che un PERCORSO non impostato ha un significato diverso da un PERCORSO vuoto. Un PERCORSO vuoto contiene un elemento vuoto e ciò significa cercare solo gli eseguibili nella directory corrente, un PERCORSO non impostato significa cercare eseguibili in un elenco predefinito di directory (ma si noti che su alcuni sistemi, non tutti gli strumenti concordano sul contenuto di quella lista)

In zsh:

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

Nelle shell POSIX (si noti che zshanche in shmodalità non è POSIX al riguardo):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.