Mostrar RUTA de una manera legible para los humanos

43

Quiero mostrar mi variable de entorno PATH de una manera más legible para los humanos.

$ 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

Estoy pensando en algo como esto:

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

Respuestas:

62

Puedes usar 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
...

También puede hacer esto en algunos shells (probados en bash y zsh):

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

En zsh, puede usar la $pathvariable para ver su ruta con espacios en lugar de dos puntos.

$ 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

Que se puede combinar 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
...

Los <<<operadores se llaman herejes. Las herejías pasan la palabra a su derecha a la entrada estándar del comando a su izquierda.

$ cat <<< 'Hello there'
Hello there

Si su caparazón no los soporta, use echouna tubería.

$ echo 'Hello there' | cat
Hello there

fuente
2
Interesante el uso de la cadena here, haría lo siguiente: echo $PATH | tr ':' '\n'pero es más clara su solución.
Arturo Herrero
1
Agregué un poco a mi respuesta para explicar el uso de herejías a cualquier transeúnte.
En zsh, print -l $pathguarda algunas pulsaciones de teclas. Falla si $pathcontiene barras invertidas, pero eso es muy inusual.
Gilles 'SO- deja de ser malvado'
Tenga en cuenta que algunos de ellos no podrán mostrar las entradas vacías en $PATH.
Stéphane Chazelas
@StephaneChazelas: Nunca pensé en eso. Las dos primeras muestran entradas vacías. Los zsh-only no lo hacen.
4

Aquí hay una manera rápida con bash

OLDIFS=$IFS IFS=: arr=($PATH) IFS=$OLDIFS
printf "%s\n" "${arr[@]}"
iruvar
fuente
44
Puede evitar guardar / restaurar IFSutilizando una subshell. por ejemplo(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Nick
1
Eso también no mostrará una entrada vacía en la mayoría de los shells si es la última ( /bin:/usr/bin:solía ser un valor común para $PATH)
Stéphane Chazelas
También puede fallar si $PATHcontiene algunos caracteres comodín (poco probable)
Stéphane Chazelas
Como especificó de bashtodos modos, puede usarlo IFS=: read -a arr <<< "$PATH"para la parte de división. IFSEl nuevo valor de esa manera se usará solo mientras se ejecuta read, por lo que no es necesario restaurarlo. pastebin.com/7E7C4AcR
manatwork
Gracias a todos por los comentarios. @manatwork, ¿sabe por qué IFSel nuevo valor persiste después de la creación de la matriz pero no después de la ejecución read?
iruvar
2

Ampliando la solución de Smith John , esto lo convierte en un buen alias en su .bash_profile:

alias MyPath='echo -e ${PATH//:/\\n}'
Justin Palmer
fuente
1

Tenga en cuenta que una RUTA no establecida tiene un significado diferente de una RUTA vacía. Una RUTA vacía contiene un elemento vacío, y eso significa buscar ejecutables solo en el directorio actual, una RUTA no establecida significa buscar ejecutables en una lista predeterminada de directorios (pero tenga en cuenta que en algunos sistemas, no todas las herramientas están de acuerdo con el contenido de esa lista)

En zsh:

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

En shells POSIX (tenga zshen cuenta que incluso en shmodo no es POSIX en ese sentido):

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
fuente