Показать PATH понятным для человека способом

43

Я хочу показать мою переменную окружения PATH более понятным для человека способом.

$ 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

Я думаю примерно так:

$ 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
...
Артуро Эрреро
источник
Межсайтовый дубликат askubuntu.com/q/600018/295286 и codegolf.stackexchange.com/q/96334/55572
Сергей Колодяжный

Ответы:

62

Вы можете использовать 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
...

Вы также можете сделать это в некоторых оболочках (протестировано в bash и zsh):

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

В zsh вы можете использовать $pathпеременную, чтобы увидеть путь с пробелами вместо двоеточий.

$ 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

Который может быть объединен с printfили 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
...

Эти <<<операторы называются herestrings. Herestrings передают слово справа от стандартного ввода команды слева.

$ cat <<< 'Hello there'
Hello there

Если ваша оболочка не поддерживает их, используйте echoи трубу.

$ echo 'Hello there' | cat
Hello there

источник
2
Интересно использовать здесь-строку, я бы сделал следующее: echo $PATH | tr ':' '\n'но более понятно ваше решение.
Артуро Эрреро
1
Я добавил немного к своему ответу, чтобы объяснить использование Herestrings любому прохожему.
В zsh print -l $pathсохраняет несколько нажатий клавиш. Он не работает, если $pathсодержит обратную косую черту, но это весьма необычно.
Жиль "ТАК - перестань быть злым"
Обратите внимание, что некоторые из них не смогут отображать пустые записи в $PATH.
Стефан Шазелас
@StephaneChazelas: я никогда не думал об этом. Первые два показывают пустые записи. Zsh-only нет.
4

Вот быстрый способ bash

OLDIFS=$IFS IFS=: arr=($PATH) IFS=$OLDIFS
printf "%s\n" "${arr[@]}"
Iruvar
источник
4
Вы можете избежать сохранения / восстановления IFS, используя подоболочку. например(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Ник
1
Это также не будет отображать пустую запись в большинстве оболочек, если она последняя ( /bin:/usr/bin:раньше она использовалась как общее значение $PATH)
Стефан Шазелас
Может также произойти сбой, если $PATHсодержит некоторые символы подстановки (маловероятно)
Стефан Шазелас
Как вы указали в bashлюбом случае, вы можете использовать IFS=: read -a arr <<< "$PATH"для разделения части. Таким образом IFS, новое значение будет использоваться только во время выполнения read, поэтому нет необходимости его восстанавливать. pastebin.com/7E7C4AcR
manatwork
Спасибо всем за отзывы. @manatwork, вы знаете, почему IFSновое значение сохраняется после создания массива, а не после выполнения read?
iruvar
2

Расширение на решение Смита Джона , это делает хороший псевдоним в вашем .bash_profile:

alias MyPath='echo -e ${PATH//:/\\n}'
Джастин Палмер
источник
1

Обратите внимание, что неустановленный PATH имеет значение, отличное от пустого PATH. Пустая переменная PATH содержит один пустой элемент, а это означает, что поиск исполняемых файлов возможен только в текущем каталоге, а неустановленная переменная PATH означает поиск исполняемых файлов в списке каталогов по умолчанию (но следует отметить, что в некоторых системах не все инструменты соглашаются с содержанием этот список)

В zsh:

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

В оболочках POSIX (обратите внимание, что zshдаже в shрежиме не POSIX в этом отношении):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
Стефан Шазелас
источник