2014-11-17 3 views
8

In Bash wird das Zuweisen von Werten zu Variablen mit T=content ohne Leerzeichen vor oder nach dem Gleichheitszeichen durchgeführt.Zuweisung von Variablen mit Leerzeichen nach dem Zeichen (=)?

Trotzdem habe ich folgendes in einem Shell-Skript PWD= /bin/pwd mit einem Leerzeichen auf der rechten Seite des Gleichheitszeichens gesehen.

Was hat der Zweck davon ein Leerzeichen?

+1

haben Sie das Skript ausgeführt und sehen, was das PWD enthält?Es wird leer sein und das aktuelle Arbeitsverzeichnis wird beim Ausführen des Skripts angezeigt. – SMA

+0

Ja, PWD wird leer – kaneda

Antwort

7

Im Beispiel PWD= /bin/pwd wird die Variable PWD auf den leeren String gesetzt, bevor der Befehl /bin/pwd ausgeführt wird. Die Änderung wird nur für diese Zeile wirksam.

Dies kann nützlich sein, um eine temporäre Änderung an einer Variablen zum Ausführen eines Befehls vorzunehmen, ohne den ursprünglichen Wert zu beeinflussen. Ein weiteres Beispiel hierfür wäre, wenn read Verwendung einer anderen IFS einzustellen:

IFS=, read a b c <<<"comma,separated,list" 

Hier wird die Feldtrenn ein Komma, so dass a, b und c korrekt gelesen werden. Nach dieser Zeile wird IFS auf den Standardwert zurückgesetzt, sodass der Rest des Skripts nicht betroffen ist.

Vielleicht auf einigen Systemen, die Ausgabe des Befehls pwd wird durch den Wert der Variablen PWD, beeinflusst, so tun dies durch PWD an anderer Stelle überschrieben verursacht Probleme verhindert.

+0

Vielleicht ist das für andere Shells als bash Kompatibilität? Das ist die Erklärung des Autors: '# Die folgende Umschreibung (im Folgenden auch wiederholt) stellt sicher, dass wir den wahren Verzeichnisnamen aufzeichnen und nicht einen, der mit Symlink-Namen gefälscht ist. – kaneda

+1

Ja, aus diesem Kommentar klingt es, als wäre das möglich '$ PWD' wird in einigen Fällen einen falschen Wert zugewiesen und' pwd' liest diesen Wert, wenn er gesetzt ist, anstatt den realen Pfad in einigen anderen Shells zu berechnen. –

+0

Das ist jetzt klar, danke – kaneda

2
PWD= pwd 

Diese Syntax weist den leeren Wert auf die Variable PWD für die Dauer des pwd Befehls.

PWD=ick 
echo "$PWD" 

Ordnet PWD für den Rest des Skripts.

PWD=ick pwd 
echo "$PWD" 

Ordnet PWD nur für die Dauer des pwd Befehl; Die echo wird den Wert wiedergeben, der vor und nach dem Aufruf pwd wirksam war.

PWD= 

Dieses einfach ordnet den leeren Wert zu PWD.

+1

Für was es wert ist, von Bash '' pwd' Befehl meldet das aktuelle Verzeichnis unabhängig von dem Wert von 'PWD'. – tripleee

+0

Danke für die Info – kaneda

+0

Übrigens, hardcoding '/ bin/pwd' ist normalerweise nicht notwendig, und könnte eine schlechte Idee sein. Skripte sollten dem Benutzer vertrauen, dass er einen vernünftigen 'PATH' hat, und ihnen ermöglichen, Systembefehle unter bestimmten Umständen zu überschreiben (das Spotten von Befehlen in einem Testskript kommt einem sofort als ein häufiges Szenario in den Sinn). Natürlich möchten Sie hier vielleicht sicherstellen, dass jeder Shell-integrierte Befehl 'pwd' zugunsten einer externen Binärdatei umgangen wird? Aber im allgemeinen Fall würde ich davon abraten. – tripleee

2

Wir reden hier nicht über zwei verschiedene Dinge.

Wenn wir

PWD=/bin/pwd 

hätten wir /bin/pwd zu PWD zuweisen.

Aber

PWD= /bin/pwd 

bedeutet, dass wir /bin/pwd mit PWD Satz auf den leeren String nennen. Diese Zuweisung betrifft nur den Unterprozess, nicht den aktuellen.

Verwandte Themen