Perché tilde (~) non si espande quando viene utilizzato con l'argomento CLI che inizia con il trattino?


9

Ho perso un paio d'ore nel tentativo di eseguire il server VNC (x0vncserver) e il client ha rifiutato di connettersi con un messaggio strano che

No password configured for VNC Auth

Il server stampa anche questo errore

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

Ok, ho perso molto tempo fino a quando ho capito che la tilde non era né espansa dalla shell, né da x0vncserver. Quindi ho eseguito questi test

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

Ma

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

Perché? Perché la shell rifiuta di espandere tilde se l'argomento inizia con un trattino? Ho pensato che la tilde si espanderà sempre finché non viene citata, ma apparentemente c'è un'altra regola che entra in gioco?



Risposte:


13

Questa è una peculiarità della bashshell descritta nel suo manuale:

Bash esegue anche l'espansione della tilde su parole che soddisfano le condizioni di assegnazione di variabili (come descritto sopra in PARAMETRI) quando compaiono come argomenti di semplici comandi. Bash non lo fa, ad eccezione dei comandi di dichiarazione sopra elencati, in modalità posix.

Ciò significa che bash sarà espandere la tilde nella PasswordFile=~/.vnc/passwdstringa, dal momento che è un argomento per echoche sembra un assegnamento di variabile.

La stringa --PasswordFile=~/.vnc/passwdnon assomiglia ad un'assegnazione variabile poiché la stringa --PasswordFilenon è un nome di variabile valido.

Si noti che bashnon farlo durante l'esecuzione in modalità POSIX, e che altre shell, come zsh, ksho yashnon fare questo per default ( zshè magicequalsubstun'opzione per l'espansione della tilde per essere eseguita dopo segni di uguale non quotate ( =) però).

Se vuoi assicurarti che il percorso della home directory dell'utente corrente sia correttamente espanso come parte di un argomento a un comando, usa il $HOMEvalore invece della tilde:

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

I "comandi dichiarazione elencati sopra" di cui al manuale sono costruiti nei comandi alias, declare, typeset, export, readonly, e local.


1
+1 | Non ci penserei.
LinuxSecurityFreak

Tuttavia nota: bash --posix -c '"export" a=~; printf "%s\n" "$a"'output ~.
Stéphane Chazelas,

2
Si noti che l' ~espansione in alias a=~sarebbe un bug di conformità POSIX (e non è utile). Ma è così che ha fatto ksh88 (che è cambiato in ksh93) ed è probabilmente il motivo per cui bash, zsh e pdksh lo fanno anche. Perché ciò yashche è stato scritto contro le specifiche POSIX non lo fa.
Stéphane Chazelas,

Questa è la risposta giusta, ma l' approccio giusto sarebbe stato quello di fornire l'argomento opzione come argomento separato, piuttosto che fondersi con l'opzione usando =in un argomento. Quindi l'espansione della tilde è all'inizio di una parola e la domanda è discutibile.
JdeBP,

1
@JdeBP, nel caso x0vncserver, x0vncserver --PasswordFile filenon funziona, è necessario --PasswordFile=file.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.