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.

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).


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

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.


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))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.