Warum wird Tilde (~) nicht erweitert, wenn es mit einem CLI-Argument verwendet wird, das mit einem Bindestrich beginnt?

9

Ich habe ein paar Stunden beim Versuch, den VNC-Server (x0vncserver) auszuführen, verloren und der Client hat sich geweigert, eine Verbindung mit einer seltsamen Nachricht herzustellen

No password configured for VNC Auth

Der Server druckt auch diesen Fehler

 SVncAuth:    opening password file '~/.vnc/passwd' failed

Ok, ich habe viel Zeit verschwendet, bis mir klar wurde, dass die Tilde weder durch die Shell noch durch x0vncserver erweitert wurde. Dann habe ich diese Tests durchgeführt

$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd

Aber

$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd

Warum ist das so? Warum weigert sich die Shell, Tilde zu erweitern, wenn das Argument mit einem Bindestrich beginnt? Ich dachte, Tilde wird sich immer erweitern, solange es nicht zitiert wird, aber anscheinend kommt eine andere Regel ins Spiel?

Tihomir Mitkov
quelle
Verwandte: Erweiterung der Tilde in zsh
Stéphane Chazelas
Siehe auch: Ist ~ immer gleich $ HOME
Stéphane Chazelas

Antworten:

13

Dies ist eine Besonderheit der bashin ihrem Handbuch beschriebenen Shell:

Bash führt auch eine Tilde-Erweiterung für Wörter durch, die die Bedingungen für Variablenzuweisungen erfüllen (wie oben unter PARAMETER beschrieben), wenn sie als Argumente für einfache Befehle angezeigt werden. Bash tut dies nicht, außer für die oben aufgeführten Deklarationsbefehle, wenn es sich im Posix-Modus befindet.

Dies bedeutet , dass bash wird die Tilde in Ihrem erweitern PasswordFile=~/.vnc/passwdZeichenfolge, da es ein Argument ist echowie eine variable Zuordnung , das aussieht.

Die Zeichenfolge --PasswordFile=~/.vnc/passwdsieht nicht wie eine Variablenzuweisung aus, da die Zeichenfolge --PasswordFilekein gültiger Variablenname ist.

Beachten Sie, dass bashdies nicht tun , wenn in POSIX - Modus ausgeführt wird , und dass andere Muscheln, wie zsh, kshoder yashtut dies standardmäßig nicht tun ( zshhat eine magicequalsubstOption für Tilde - Erweiterung nach unquoted Gleichheitszeichen durchgeführt werden ( =) , obwohl).

Wenn Sie sicherstellen möchten, dass der Pfad des Basisverzeichnisses des aktuellen Benutzers als Teil eines Arguments zu einem Befehl ordnungsgemäß erweitert wird, verwenden Sie den $HOMEWert anstelle der Tilde:

echo --PasswordFile="$HOME/.vnc/passwd"

Die „Erklärung Befehle oben aufgeführten“ bezeichnet in der Betriebsanleitung ist in Befehlen der eingebaut alias, declare, typeset, export, readonly, und local.

Kusalananda
quelle
1
+1 | Daran würde ich nicht denken.
LinuxSecurityFreak
Hinweis: bash --posix -c '"export" a=~; printf "%s\n" "$a"'Ausgänge ~.
Stéphane Chazelas
2
Beachten Sie, dass das ~Erweitern alias a=~ein POSIX-Konformitätsfehler ist (und nicht nützlich ist). Aber so hat es ksh88 gemacht (das hat sich in ksh93 geändert) und wahrscheinlich machen es auch bash, zsh und pdksh. Warum yashdas, was gegen die POSIX-Spezifikation geschrieben wurde, es nicht tut.
Stéphane Chazelas
Dies ist die richtige Antwort, aber der richtige Ansatz wäre gewesen, das Optionsargument nur als separates Argument anzugeben, anstatt es mit der Option =zu einem Argument zusammenzuführen. Dann steht die Tilde-Erweiterung am Anfang eines Wortes und die Frage ist strittig.
JdeBP
1
@JdeBP, wie es passiert, im Fall von x0vncserver, x0vncserver --PasswordFile filefunktioniert nicht, brauchen Sie --PasswordFile=file.
Stéphane Chazelas