Ich habe kürzlich Folgendes in meinem Cygwin-Profil festgestellt:
/usr/local/bin:/usr/bin${PATH:+:${PATH}}
Was heißt das? Warum ist nicht nur $ PATH? Ist dies ein 'wenn $ PATH existiert, dann addiere: $ PATH'? Mein Ziel ist es, die Reihenfolge auszutauschen und die Cygwin-Pfade hinter den Windows-Pfad zu setzen. In der Vergangenheit hätte ich
$PATH:/usr/local/bin:/usr/bin
aber das verwirrt mich. Vielleicht sollte ich es tun
PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
das anhängen: am ende des $ PATH?
shell
path
variable-substitution
tofutim
quelle
quelle
Antworten:
Das
:+
ist eine Form der Parametererweiterung :Mit anderen Worten, wenn die Variable
$var
definiert ist,echo ${var:+foo}
wird gedruckt,foo
und wenn dies nicht der Fall ist, wird die leere Zeichenfolge gedruckt.Der zweite
:
ist nichts Besonderes. Dies ist das Zeichen, das in der Liste der Verzeichnisse in als Trennzeichen verwendet wird$PATH
. Also,PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"
ist eine Kurzform des Schreibens:Es ist nur ein cleverer Trick, um zu vermeiden, dass ein zusätzliches Element hinzugefügt wird,
:
wenn$PATH
es nicht festgelegt ist. Beispielsweise:Aber wenn nicht gesetzt
PATH
ist:A
:
selbst fügt das aktuelle Verzeichnis dem hinzu$PATH
. Mit wird diesPATH="/new/dir${PATH:+:$PATH}"
vermieden. So sicher, können Sie verwenden,PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
wenn Sie möchten, oder Sie können verwenden,PATH="$PATH:/usr/local/bin:/usr/bin"
wenn Sie es vorziehen. Der einzige Unterschied besteht darin, dass der erstere möglicherweise ein zusätzliches:
Verzeichnis hinzufügt und dadurch Ihr aktuelles Verzeichnis zu Ihrem hinzufügt$PATH
.quelle
:
schädlich?$PATH
(siehe @ AndyBs Antwort ). Dies kann in manchen Situationen ein Sicherheitsrisiko darstellen (z. B. wenn ein Angreifer ein destruktives Skript in Ihr aktuelles Verzeichnis hochgeladen und es benanntls
hat), aber in den meisten Fällen macht es Ihnen nichts aus. Tatsächlich fügen einige Systeme das aktuelle VerzeichnisPATH
ohnehin standardmäßig hinzu.csh
behandeln ihn dann als Array.Sie haben recht, es bedeutet "wenn $ PATH existiert - und nicht null ist - dann fügen Sie hinzu: $ PATH".
Sie müssen prüfen, ob $ PATH vorhanden ist, da Sie den führenden (oder nachfolgenden) Doppelpunkt nicht hinzufügen möchten, wenn $ PATH nicht definiert ist. Ein Verzeichnisname mit der Länge Null (null) im Pfad, wie in
:/usr/local/bin:/usr/bin
oder/usr/local/bin:/usr/bin:
oder/usr/local/bin::/usr/bin
, bedeutet, dass das aktuelle Verzeichnis durchsucht wird .Auszug aus
man bash
:Das ist wahrscheinlich nicht das, was Sie tun möchten.
Die folgenden beiden Zeilen machen dasselbe:
quelle