Was bedeutet $ {GZIP_BINDIR - '/ bin'} in der Bash?

13

Kann jemand erklären, was dieser Befehl bedeutet?

PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH
Rashmi Narahari
quelle

Antworten:

19

${GZIP_BINDIR-'/bin'}ist ein bashParametererweiterungsmuster. Von man bash:

${parameter:-word}
              Use Default Values.  If parameter is unset or null, 
the expansion of word is substituted.  Otherwise, the  value  of parameter
is substituted.

Unmittelbar vor dieser Portion hat die Manpage (danke an @jwodder für die Benachrichtigung):

Omitting the colon results in a test only for a parameter that is unset.

Wie in der Manpage angegeben, wird der Standardwert der Variablen festgelegt GZIP_BINDIR. Wenn GZIP_BINDIRzuvor ein Wert festgelegt wurde (außer Null, da Sie ihn nicht verwenden :), wird dieser Wert verwendet, andernfalls /binwird er als Wert der Variablen verwendet GZIP_BINDIR.

Wenn Sie andererseits auch auf Nullwerte testen möchten, verwenden Sie dieses Muster (include :):

${GZIP_BINDIR:-'/bin'}

Danach $PATHwird das auf die Werte erweitert, die es zuvor gehalten hat. Also, wenn PATHzuvor:

/usr/sbin:/usr/bin

Nun wird dein PATHWille (sofern GZIP_BINDIRnicht festgelegt):

/bin:/usr/sbin:/usr/bin

export PATHstellt dies PATHallen untergeordneten Prozessen zur Verfügung.

heemayl
quelle
Ich glaube , du verpasst haben , eine :in${GZIP_BINDIR-'/bin'} “ Nicht unbedingt. ${parameter-word}ist auch gültig, scheint aber nicht in der Manpage zu sein.
nyuszika7h
@ nyuszika7h Ja, ich wusste es vorher nicht ... seltsam, warum es nicht in der Manpage enthalten ist ...
heemayl
In der bash-Manpage auf meinem Computer heißt es im Absatz direkt über dem Abschnitt :-: "Wenn Sie keine Teilzeichenfolgenerweiterung durchführen, testen Sie mit den unten dokumentierten Formularen (z. B. :-), ob der Parameter nicht gesetzt oder null ist. Lassen Sie den Doppelpunkt weg führt zu einem Test nur für einen Parameter, der nicht gesetzt ist. "
jwodder
Als Randnotiz können Sie die Einstellung von PATHund exportin einem einzigen Befehl wie folgt kombinieren :export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
Paddy Landau
8

Befindet sich in der Parametererweiterung wirklich kein Doppelpunkt vor dem Bindestrich ${GZIP_BINDIR-'/bin'}?

Diese Art von Konstrukt wird fast immer mit einem Doppelpunkt geschrieben, ${GZIP_BINDIR:-'/bin'}was bedeutet: "Wenn $ GZIP_BINDIR NULL ist oder nicht gesetzt ist, setze es auf '/ bin'".

Die von Ihnen angegebene Syntax ist jedoch gültig, aber selten. ${GZIP_BINDIR-'/bin'}(kein Doppelpunkt) bedeutet, "wenn $ GZIP_BINDIR nicht gesetzt ist, setze es auf '/ bin'". Wenn es gesetzt ist (deklariert wurde), aber nichts zugewiesen ist (z. B. NULL), wird nichts eingefügt.

Es kann hier ein Fehler sein , obwohl als Doppelpunkt folgt dem variablen construct (...} :$ PATH ...) wird noch eingefügt werden , wenn $ GZIP_BINDIR Satz ist aber NULL. Da dies zu Beginn des $ PATH einen Doppelpunkt hinzufügen würde, wird das aktuelle Verzeichnis zuerst durchsucht.

Dies wird von den meisten als Sicherheitsproblem angesehen, da es einfacher ist, ein Schadprogramm mit demselben Namen wie Standardbefehle auszuführen, indem es einfach im aktuellen Verzeichnis abgelegt wird.

Wenn Sie $ PATH unverändert lassen, wenn $ GZIP_BINDIR auf NULL (leer) gesetzt ist, ist die Syntax korrekt ${GZIP_BINDIR-'/bin:'}$PATH; export PATH

Um $ PATH unverändert zu lassen, wenn $ GZIP_BINDIR entweder nicht gesetzt oder aber NULL gesetzt ist, wäre die korrekte Syntax ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH

DocSalvager
quelle
2

Dieser Befehl aktualisiert die Variable PATH.

Dies PATHist eine Umgebungsvariable, die eine Reihe von Verzeichnissen angibt, in denen sich ausführbare Programme befinden.

PATH="${GZIP_BINDIR-'/bin'}:$PATH";

Dies fügt den Wert einer anderen Variablen hinzu, GZIP_BINDIRwenn der vorherige Pfad verlassen wird. Verwenden Sie stattdessen / bin und fügen Sie ihn dem Pfad hinzu

export PATH

Mit export wird der Pfad festgelegt, der für alle untergeordneten Prozesse und Subshells verfügbar ist. Lesen Sie dies, um weitere Informationen zu erhalten

Sie müssen beachten, dass dies nicht statisch ist und Sie es verlieren werden, sobald Sie Ihre Shell verlassen.

Um diese PATH-Bearbeitung dauerhaft zu machen, müssen Sie diese Zeilen an Ihre anhängen .bashrc

gedit .bashrc

und füge die Zeile hinzu

export PATH="${GZIP_BINDIR-'/bin'}:$PATH"

Führen Sie dann den Befehl aus

source .bashrc
Maythux
quelle
GZIP_BINDIR ist die Variable
Maythux
was stimmt nicht Nein, habe ich nicht? meins ist auch downvoted
Maythux
Warum Downvoting ?!
Maythux