Was bringt es, hier "x $ START_DAEMON" = "xyes" zu verwenden? (das führende x)

7

Dies war Teil eines Fetchmail-Daemon-Skripts.

if [ ! "x$START_DAEMON" = "xyes" -a ! "$1" = "status" ]; then

Was ist der Sinn der Verwendung x$START_DAEMON = "xyes"; warum nicht einfach benutzen $START_DAEMON = "yes"?

Gänseblümchen
quelle

Antworten:

8

Ich habe Fälle gesehen , wo das x$variablewar nicht zitiert, und in diesem Fall ist es Situationen zu umgehen , wo die Variable ( $START_DAEMONin diesem Fall) leer sein könnte. Andernfalls würde Ihr Test prüfen, ob ! = "yes"und der Test würde fehlschlagen. Wie Sie bereits in den Kommentaren erwähnt haben, wird dies durch doppelte Anführungszeichen erledigt x$variable.

Andererseits führte mich eine Frage zu ServerFault zu dieser Seite: http://pubs.opengroup.org/onlinepubs/009695399/utilities/test.html , wobei verhindert wird, dass die Variablenerweiterung mit einem möglicherweise verwirrenden Zeichen beginnt [odertest

Trotzdem denke ich, dass dies ein Problem ist, das möglicherweise nur in älteren Shells ("Historisch", wie auf der Opengroup-Seite angegeben) ein Problem darstellt und dass neuere Implementierungen das Richtige ohne das xtun, solange es sich zumindest um doppelte Anführungszeichen handelt . Es kann sich also in erster Linie um eine Codierungstradition handeln. Ich konnte jedoch ein Problem mit /bin/shSunOS 5.10 bestätigen :

 # a="!"; [ "$a" = "yes" ] && echo ok
 test: argument expected
Lars Rohrbach
quelle
unset a;[ "$a" = "yes" ] && echo okdas meldet keinen Fehler, hmm
Gänseblümchen
Du hast Recht. Ich habe Fälle gesehen, in denen x$variablenicht zitiert wurde, und es können Situationen gewesen sein, in denen Probleme mit testaufgetreten sind. Die Verwendung eines bekannten Zeichens wie xverhindert jedoch andere Probleme mit Sonderzeichen - ich werde die Antwort aktualisieren.
Lars Rohrbach
1
Es kann sich auch um ein Shell-Zitat handeln. Zum Beispiel beschwert sich Bash 4.2.24 bash: !: event not foundmit Ihrem veröffentlichten Beispiel, vermeidet jedoch die Erweiterung des Verlaufs und funktioniert a=\!; [[ "$a" = "yes" ]] && echo okstattdessen einwandfrei .
CodeGnome
POSIX schreibt das Parsen aller korrekten testAusdrücke bis zu drei Token vor, wie z. B. diesen. Historische Bourne-Muscheln sind fehlerhaft. Das xPräfix macht das Parsen von links nach rechts eindeutig. Die doppelten Anführungszeichen sind in jeder Shell erforderlich, falls der Wert der Variablen leer ist, Leerzeichen enthält usw. Die doppelten Anführungszeichen sind nicht erforderlich. Dies [[…]]ist eine spezielle Syntax, nicht nur ein eingebautes Dienstprogramm wie [.
Gilles 'SO - hör auf böse zu sein'