Mostrar PATH de maneira legível por humanos


43

Quero mostrar minha variável de ambiente PATH de uma maneira mais legível para 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

Estou pensando em algo assim:

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

Respostas:


62

Você pode 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
...

Você também pode fazer isso em alguns shells (testados no bash e zsh):

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

No zsh, você pode usar a $pathvariável para ver seu caminho com espaços em vez de dois pontos.

$ 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 pode ser combinado com 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
...

Os <<<operadores são chamados herestrings. Herestrings passa a palavra à direita para a entrada padrão do comando à esquerda.

$ cat <<< 'Hello there'
Hello there

Se o seu shell não os suportar, use echoum cachimbo.

$ echo 'Hello there' | cat
Hello there

2
Interessante o uso da string aqui, eu faria o seguinte: echo $PATH | tr ':' '\n'mas é mais clara sua solução.
Arturo Herrero

1
Eu adicionei um pouco à minha resposta para explicar o uso de herestrings a todos os transeuntes.

No zsh, print -l $pathsalva algumas teclas. Ele falha se $pathcontém barras invertidas, mas isso é altamente incomum.
Gilles 'SO- stop be evil'

Observe que alguns deles não exibem as entradas vazias no $PATH.
Stéphane Chazelas

@StephaneChazelas: Eu nunca pensei sobre isso. As duas primeiras exibem entradas vazias. Os zsh-only não.

4

Aqui está uma maneira rápida de bash

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

4
Você pode evitar salvar / restaurar IFSusando um subshell. Exemplo(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Nick

1
Isso também vai deixar de exibir uma entrada vazia na maioria das conchas se é passado ( /bin:/usr/bin:costumava ser um valor comum para $PATH)
Stéphane Chazelas

Em também pode falhar se $PATHcontém alguns caracteres curinga (improváveis)
Stéphane Chazelas

Como você especificou de bashqualquer maneira, você pode usar IFS=: read -a arr <<< "$PATH"para a parte de divisão. O IFSnovo valor dessa maneira será usado apenas durante a execução do read, portanto, não há necessidade de restaurá-lo. pastebin.com/7E7C4AcR
manatwork

Obrigado a todos pelo feedback. @manatwork, você sabe por que IFSo novo valor persiste após a criação da matriz, mas não após a execução read?
Iruvar


1

Observe que um caminho não definido tem um significado diferente de um caminho vazio. Um PATH vazio contém um elemento vazio, e isso significa procurar apenas executáveis ​​no diretório atual; um PATH não definido significa procurar executáveis ​​em uma lista padrão de diretórios (mas observe que em alguns sistemas, nem todas as ferramentas concordam com o conteúdo de essa lista)

Em zsh:

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

Nos shells POSIX (observe que, zshmesmo no shmodo, não é POSIX a esse respeito):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.