Dodawanie ścieżek do PATH przy użyciu składni wieloliniowej

16

O ile rozumiem, zwykłym sposobem dodawania ścieżki do PATHzmiennej środowiskowej jest łączenie ścieżek oddzielonych :znakiem.

Na przykład, jeśli chcę dodać trzy ścieżki do niego /my/path/1, /my/path/2i /my/path/3chciałbym zrobić to w następujący sposób:

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

co nie jest łatwe do odczytania.

Czy istnieje sposób na zdefiniowanie lub dodanie ścieżek do PATHzmiennej przy użyciu składni wielowierszowej ? Być może używasz tablic? Szukam czegoś takiego:

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

W przypadku, gdy istnieją ciekawe rozwiązania specyficzne dla powłoki, szukam rozwiązania w Zsh.

Amelio Vazquez-Reina
źródło

Odpowiedzi:

12

Nie wiem, czy to działa w Zsh, ale działa w bash:

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

Edytuj i jeszcze krótszy:

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

I bez odradzania procesu:

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

Podwójne cudzysłowy są ważne arround $PATH, $IFS, ${new_path[*]}i $OLD_IFS, aby utrzymać miejsca w interpretacji zmiennych i unikać surowego IFS.

Aktualizacja 2 z komentarzami i zarządzaniem pustymi liniami za pomocą 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`

Znak komentarza musi być pierwszym znakiem w linii, a puste linie powinny być całkowicie puste. Aby zarządzać spacjami i tabulatorami przed komentarzem i pustymi wierszami, użyj sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'dzamiast tego (tabulatory do przetestowania, ponieważ mogą być specyficzne dla implementacji sed).

jfg956
źródło
Przetestowałem ostatni fragment kodu w Zsh i działa. Podoba mi się również, że jest nieco czystszy (jedna ścieżka na linię) niż inne rozwiązania. Czy rozwiązanie może pomieścić skomentowane linie (ścieżki)? Co powiesz na puste linie?
Amelio Vazquez-Reina
Aktualizuj z komentarzami i zarządzaniem pustymi liniami.
jfg956
A dzięki sed, jeśli chcesz grać, możesz uniknąć procesu wklejania za pomocą bardziej skomplikowanego skryptu.
jfg956
Czy można używać wcięć dla ścieżek w pasterozwiązaniu?
void.pointer
20

Nie jest to wcale interesujące rozwiązanie, ale bardzo przenośne:

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3
Mata
źródło
1
Jest to typowe dla tego, co widziałem przez lata. Można łatwo zmienić kolejność ścieżek, a nawet zmienić element na PATH = / my / path / 1: $ {PATH}, aby wymusić dodawanie.
bsd
1
Możesz także użyć, +=aby uniknąć konieczności całkowitego przebudowywania łańcucha.
Chris Down,
I nie musisz nawet używać aparatów ortodontycznych. Dwukropków nie można używać w nazwach zmiennych środowiskowych, więc nie ma dwuznaczności do rozwiązania.
Alexios
+1 za brak zainteresowania. Interesujące może być czasem dobre, ale to nie jeden z tych czasów! (Zwłaszcza, że ​​PO wyraźnie wspomniał jako „niełatwy do odczytania” jako problem.)
ruakh
@ChrisDown Czy istnieje składnia, która nakłada się bez przebudowywania łańcucha?
John P
12

W Zsh $pathjest tablica:

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

Uwaga: oba pathsą małe.

Kabie
źródło
To zależy od powłoki, nie wszyscy sobie z tym poradzą.
vonbrand,
1
@vonbrand: Tak, ale działa w Zsh. Myślę, że warto wspomnieć.
Kabie,
3
+1 (To pytanie jest oznaczone zsh )
Johnsyweb
Ponieważ OP dokładnie zapytał o zsh, jest to najlepsza opcja
Daniel Serodio
1
dla każdego, kto
chce
7

W Zsh, jeśli dodajesz katalogi na końcu ścieżki:

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

Przenośnie: jak poprawnie dodać ścieżkę do PATH?

Za pomocą kwalifikatorów glob można wykluczyć wpisy, które nie są istniejącymi katalogami lub dowiązaniami symbolicznymi do takich. Może to być pożądane lub nie, w zależności od tego, czy katalogi zostaną dodane później podczas sesji (np. Jeśli znajdują się na zdalnych systemach plików). Nie możesz tego zrobić ze path+=/my/pathskładnią, ponieważ prawa strona znajduje się w kontekście łańcuchowym i dlatego nie podlega globowaniu; możesz to zrobić, path+=(/my/path)ponieważ każdy element tablicy jest rozwijany w kontekście listy.

path+=(/path/to/app/{i386,share}/bin(-/N))
Gilles „SO- przestań być zły”
źródło