J'ai perdu quelques heures en essayant d'exécuter le serveur VNC (x0vncserver) et le client a refusé de se connecter avec un message étrange
No password configured for VNC Auth
Le serveur affiche également cette erreur
SVncAuth: opening password file '~/.vnc/passwd' failed
Ok, j'ai perdu beaucoup de temps jusqu'à ce que je réalise que le tilde n'était ni développé par le shell, ni par x0vncserver. Ensuite, j'ai exécuté ces tests
$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd
Mais
$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd
Pourquoi donc? Pourquoi le shell refuse de développer le tilde si l'argument commence par un tiret? Je pensais que le tilde se développerait toujours tant qu'il ne serait pas cité, mais apparemment il y a une autre règle qui entre en jeu?
Réponses:
C'est une particularité de la
bash
coque décrite dans son manuel:Cela signifie que
bash
va développer le tilde dans votrePasswordFile=~/.vnc/passwd
chaîne, car c'est un argumentecho
qui ressemble à une affectation de variable.La chaîne
--PasswordFile=~/.vnc/passwd
ne ressemble pas à une affectation de variable car la chaîne--PasswordFile
n'est pas un nom de variable valide.Notez que
bash
cela ne fait pas cela lors de l'exécution en mode POSIX, et que d'autres shells, commezsh
,ksh
ouyash
ne le font pas par défaut (zsh
a unemagicequalsubst
option pour que l'expansion de tilde soit effectuée après des signes égaux (=
)).Si vous voulez vous assurer que le chemin du répertoire personnel de l'utilisateur actuel est correctement développé dans le cadre d'un argument d'une commande, utilisez la
$HOME
valeur au lieu du tilde:Les « commandes de déclaration énumérées ci - dessus » mentionnées dans le manuel sont les commandes intégrées
alias
,declare
,typeset
,export
,readonly
etlocal
.la source
bash --posix -c '"export" a=~; printf "%s\n" "$a"'
sorties~
.~
développement enalias a=~
serait un bogue de conformité POSIX (et n'est pas utile). Mais c'est ainsi que ksh88 l'a fait (qui a changé dans ksh93) et c'est probablement pourquoi bash, zsh et pdksh le font aussi. Pourquoiyash
ce qui a été écrit contre la spécification POSIX ne le fait pas.=
en un seul argument. Ensuite, l'expansion tilde est au début d'un mot et la question est théorique.x0vncserver
,x0vncserver --PasswordFile file
ne fonctionne pas, vous en avez besoin--PasswordFile=file
.