Показать 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
...

Ответы:


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[@]}"

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.