Покажіть 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. Херестрінг передає слово праворуч на стандартне введення команди зліва.

$ cat <<< 'Hello there'
Hello there

Якщо ваша оболонка не підтримує їх, використовуйте echoі трубу.

$ echo 'Hello there' | cat
Hello there

2
Цікаве використання тут-рядка, я би зробив наступне: echo $PATH | tr ':' '\n'але більш чітке ваше рішення.
Артуро Ерреро

1
Я трохи доповнив свою відповідь, щоб пояснити використання хребта будь-яким перехожим.

У zsh print -l $pathзберігається кілька натискань клавіш. Він не спрацьовує, якщо $pathмістить зворотні риси, але це дуже незвично.
Жил "ТАК - перестань бути злим"

Зауважте, що деякі з них не зможуть відображати порожні записи в $PATH.
Stéphane Chazelas

@StephaneChazelas: Я ніколи про це не думав. Перші два відображають порожні записи. Тільки zsh - ні.

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)
Stéphane Chazelas

Також може вийти з ладу, якщо $PATHмістить кілька символів підстановки (навряд чи)
Stéphane Chazelas

Як ви bashвсе одно вказали , ви можете використовувати IFS=: read -a arr <<< "$PATH"для розбивної частини. IFSНове значення цього способу використовуватиметься лише під час його виконання read, тому не потрібно його відновлювати. pastebin.com/7E7C4AcR
манатура

Дякую всім за відгуки. @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.