Was bedeutet $ {PATH: +: $ {PATH}}?


24

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?


Antworten:


38

Das :+ist eine Form der Parametererweiterung :

$ {parameter: + [word]} : Verwenden Sie einen alternativen Wert.

Wenn der Parameter nicht gesetzt oder null ist, wird null ersetzt. Andernfalls wird die Erweiterung des Wortes (oder eine leere Zeichenfolge, wenn das Wort weggelassen wird) ersetzt.

Mit anderen Worten, wenn die Variable $vardefiniert ist, echo ${var:+foo}wird gedruckt, foound 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:

if [ -z "$PATH" ]; then
    PATH=/usr/local/bin:/usr/bin
else
    PATH=/usr/local/bin:/usr/bin:$PATH
fi

Es ist nur ein cleverer Trick, um zu vermeiden, dass ein zusätzliches Element hinzugefügt wird, :wenn $PATHes nicht festgelegt ist. Beispielsweise:

$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin

Aber wenn nicht gesetzt PATHist:

$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:

A :selbst fügt das aktuelle Verzeichnis dem hinzu $PATH. Mit wird dies PATH="/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.


Ist das extra :schädlich?
Katze

4
@tac nicht wirklich, es fügt nur das aktuelle Verzeichnis zu Ihrem hinzu $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 benannt lshat), aber in den meisten Fällen macht es Ihnen nichts aus. Tatsächlich fügen einige Systeme das aktuelle Verzeichnis PATHohnehin standardmäßig hinzu.
Terdon

Der Pfad ist der einzige Ort, an dem ich es vorziehen würde, sie cshbehandeln ihn dann als Array.
Hometoast

8

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/binoder /usr/local/bin:/usr/bin:oder /usr/local/bin::/usr/bin, bedeutet, dass das aktuelle Verzeichnis durchsucht wird .

Auszug aus man bash:

   PATH   ...
          A zero-length (null) directory name in the value of PATH indicates 
          the current directory.  A  null  directory name may appear as two 
          adjacent colons, or as an initial or trailing colon.
          ...

Das ist wahrscheinlich nicht das, was Sie tun möchten.

Die folgenden beiden Zeilen machen dasselbe:

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.