Додавання шляхів до PATH за допомогою багаторядкового синтаксису


16

Наскільки я розумію, звичайний спосіб додати шлях до PATHзмінної середовища - це об'єднання контурів, розділених :символом.

Наприклад, якщо я хочу додати до нього три контури /my/path/1, /my/path/2і /my/path/3мені доведеться це зробити так:

PATH=$PATH:/my/path/1:/my/path/2:/my/path/3

що читати непросто.

Чи є спосіб визначити або додати шляхи до PATHзмінної за допомогою багаторядкового синтаксису ? Можливо, використовуючи масиви? Я шукаю щось подібне:

PATH = 
$PATH
/my/path/1
/my/path/2
/my/path/3

У випадку, якщо є цікаві рішення, які є специфічними для оболонки, я шукаю рішення в zsh.

Відповіді:


12

Я не знаю, чи працює він в zsh, але він працює в bash:

PATH=$(paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF
)

Редагування та ще коротше:

PATH=`paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF`

І без нерестування процесу:

new_path=(
"$PATH"
/my/path/1
/my/path/2
/my/path/3)
OLD_IFS="$IFS"
export IFS=":"
PATH="${new_path[*]}"
export IFS="$OLD_IFS"

Подвійні лапки необхідні Arround $PATH, $IFS, ${new_path[*]}і $OLD_IFSзберегти прогалини в інтерпретації змінних і уникнути оболочечной МФС.

Update2 з коментарями та управлінням порожніх рядків за допомогою sed:

PATH=`sed -e '/^#/'d -e '/^$/'d << EOF | paste -d ":" -s 
$PATH
/my/path/1
# This is a comment.
/my/path/2

/my/path/3
EOF`

Символ коментаря повинен бути першим знаком у рядку, а порожні рядки повинні бути повністю порожніми. Щоб керувати пробілами та вкладками перед коментарями та порожніми рядками, sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'dзамість цього використовуйте (вкладки для тестування, оскільки це може бути специфічно для реалізації sed).


Я протестував останній фрагмент в zsh, і він працює. Мені також подобається, що він трохи чистіший (один шлях на рядок), ніж інші рішення. Чи може рішення вмістити коментовані рядки (шляхи)? Як щодо порожніх рядків?
Амеліо Васкес-Рейна

Оновлення за допомогою коментарів та управління порожніми рядками.
jfg956

І з sed, якщо ви хочете грати, ви можете уникнути процесу вставки з більш складним сценарієм.
jfg956

Чи добре використовувати відступ для шляхів у pasteрозчині?
void.pointer

20

Зовсім не цікаве рішення, але дуже портативне:

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3

1
Це характерно для того, що я бачив протягом багатьох років. Можна легко переупорядкувати шляхи або навіть змінити елемент, який буде PATH = / my / path / 1: $ {PATH}, щоб примусити попередньо передбачити.
bsd

1
Ви також можете використовувати, +=щоб уникнути необхідності повністю відновлювати рядок.
Кріс Даун

І вам навіть не потрібно використовувати брекети. Кольори не можна використовувати в назвах змінних оточуючих, тому немає двозначності для вирішення.
Олексій

+1 за те, що не цікаво. Цікаве може бути корисним іноді, але це не один із тих часів! (Тим більше, що в ОП явно згадується як "не легко прочитати" як проблема.)
ruakh

@ChrisDown Чи є синтаксис, який передує без відновлення рядка?
Іван П

12

У zsh $path- це масив:

path=(
    $path
    ~/.local/bin
    ~/.gem/ruby/2.0.0/bin
)

Примітка: і те, і інше path.


Це залежить від оболонки, не всі з цим справляються.
фонбранд

1
@vonbrand: Так, але працює в zsh. Думаю, варто згадати.
Кабі

3
+1 (Це питання позначено тегом zsh )
Johnsyweb

Оскільки ОП спеціально запитала про zsh, це найкращий варіант
Даніель Серодіо

1
для всіх, хто зацікавлений дізнатися більше про $ шлях проти $ PATH відзначте цей пост
mbigras

7

У zsh, якщо ви додаєте каталоги в кінці шляху:

path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)

Портативно: Як правильно додати шлях до PATH?

Ви можете використовувати глобальні класифікатори, щоб виключити записи, які не є існуючими каталогами або символічними посиланнями на такі. Це може бути або не бажаним, залежно від того, ви очікуєте, що каталоги можуть бути додані пізніше під час сеансу (наприклад, якщо вони є у віддалених файлових системах). Ви не можете зробити це з path+=/my/pathсинтаксисом, оскільки права частина знаходиться в рядковому контексті і тому не зазнає глобалізації; ви можете це зробити, path+=(/my/path)оскільки кожен елемент масиву розширений у контексті списку.

path+=(/path/to/app/{i386,share}/bin(-/N))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.