Hinzufügen von Pfaden zu PATH mithilfe einer mehrzeiligen Syntax

16

Soweit ich weiß, besteht die übliche Möglichkeit, der PATHUmgebungsvariablen einen Pfad hinzuzufügen, darin, Pfade zu verketten, die durch das :Zeichen getrennt sind.

Wenn ich zum Beispiel drei Pfade hinzufügen möchte /my/path/1, /my/path/2und /my/path/3, müsste ich das wie folgt tun:

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

das ist nicht leicht zu lesen.

Gibt es eine Möglichkeit, Pfade zur Variablen mithilfe einer mehrzeiligen Syntax zu definieren oder hinzuzufügen ? Verwenden Sie möglicherweise Arrays? Ich suche so etwas:PATH

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

Für den Fall, dass es interessante Lösungen gibt, die Shell-spezifisch sind, suche ich eine Lösung in zsh.

Amelio Vazquez-Reina
quelle

Antworten:

12

Ich weiß nicht, ob es in zsh funktioniert, aber es funktioniert in bash:

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

Bearbeiten und noch kürzer:

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

Und ohne einen Prozess zu erzeugen:

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

Die doppelten Anführungszeichen sind wichtig arround $PATH, $IFS, ${new_path[*]}und$OLD_IFS zu halten , Räume in der Variablen und zur Vermeidung von Shell Interpretation von IFS.

Update2 mit Kommentaren und Leerzeilenverwaltung mit 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`

Das Kommentarzeichen muss das erste Zeichen in der Zeile sein, und leere Zeilen müssen vollständig leer sein. Um Leerzeichen und Tabulatoren vor dem Kommentar und in leeren Zeilen zu verwalten, verwenden Sie sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'dstattdessen (zu testende Tabulatoren, da dies möglicherweise spezifisch für die sed-Implementierung ist).

jfg956
quelle
Ich habe das letzte Snippet in zsh getestet und es funktioniert. Mir gefällt auch, dass es ein bisschen sauberer ist (ein Pfad pro Zeile) als die anderen Lösungen. Kann die Lösung kommentierte Zeilen (Pfade) aufnehmen? Wie wäre es mit leeren Zeilen?
Amelio Vazquez-Reina
Update mit Kommentaren und Leerzeilenverwaltung.
jfg956
Und mit sed können Sie den Einfügevorgang mit einem komplizierteren Skript umgehen, wenn Sie spielen möchten.
jfg956
Ist es in Ordnung, Einrückungen für die Pfade in der pasteLösung zu verwenden?
void.pointer
20

Keine interessante Lösung, aber sehr portabel:

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3
Matte
quelle
1
Das ist typisch für das, was ich im Laufe der Jahre gesehen habe. Man kann die Pfade leicht neu anordnen oder sogar ein Element so ändern, dass es PATH = / my / path / 1: $ {PATH} ist, um das Voranstellen zu erzwingen.
bsd
1
Sie können auch verwenden +=, um zu vermeiden, dass die Zeichenfolge vollständig neu erstellt werden muss.
Chris Down
Und Sie müssen nicht einmal die Zahnspange benutzen. Doppelpunkte können nicht in Umgebungsvariablennamen verwendet werden, sodass keine Mehrdeutigkeiten zu lösen sind.
Alexios
+1 für nicht interessant zu sein. Interessantes kann manchmal gut sein, aber dies ist keine dieser Zeiten! (Zumal das OP ausdrücklich "nicht leicht zu lesen" als Problem erwähnte.)
ruakh
@ChrisDown Gibt es eine Syntax, die vorangestellt wird, ohne die Zeichenfolge neu zu erstellen?
John P
12

In zsh $pathist ein Array:

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

Hinweis: Beide pathsind Kleinbuchstaben.

Kabie
quelle
Das hängt von der Shell ab, nicht alle kommen damit klar.
Vonbrand
1
@vonbrand: Ja, funktioniert aber in zsh. Ich denke , es lohnt sich zu erwähnen.
Kabie
3
+1 (Diese Frage ist mit zsh markiert )
Johnsyweb
Da das OP speziell nach zsh gefragt hat, ist dies die beste Option
Daniel Serodio,
1
Für alle, die mehr über den Unterschied zwischen $ path und $ PATH
erfahren möchten, lesen Sie
7

Wenn Sie in zsh Verzeichnisse am Ende des Pfads hinzufügen:

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

Portabel: Wie füge ich einen Pfad korrekt zu PATH hinzu?

Sie können Glob-Qualifikatoren verwenden , um Einträge auszuschließen, bei denen es sich nicht um vorhandene Verzeichnisse oder symbolische Verknüpfungen zu solchen handelt. Dies kann wünschenswert oder nicht wünschenswert sein, abhängig davon, ob Sie erwarten, dass die Verzeichnisse möglicherweise später während der Sitzung hinzugefügt werden (z. B. wenn sie sich auf entfernten Dateisystemen befinden). Dies ist mit der path+=/my/pathSyntax nicht möglich, da sich die rechte Seite in einem Zeichenfolgenkontext befindet und daher keine Verschiebungen durchläuft. Dies ist möglich, path+=(/my/path)da jedes Array-Element in einem Listenkontext erweitert wird.

path+=(/path/to/app/{i386,share}/bin(-/N))
Gilles 'SO - hör auf böse zu sein'
quelle