Perdí un par de horas tratando de ejecutar el servidor VNC (x0vncserver) y el cliente se negó a conectarse con un mensaje extraño que
No password configured for VNC Auth
El servidor también imprime este error.
SVncAuth: opening password file '~/.vnc/passwd' failed
Ok, perdí mucho tiempo hasta que me di cuenta de que la tilde no estaba expandida por el shell ni por x0vncserver. Entonces corrí estas pruebas
$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd
Pero
$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd
¿Porqué es eso? ¿Por qué el shell se niega a expandir tilde si el argumento comienza con un guión? Pensé que tilde siempre se expandirá siempre que no se cite, pero aparentemente hay otra regla que entra en juego.
Respuestas:
Esta es una peculiaridad del
bash
shell descrito en su manual:Esto significa que
bash
va a expandir la tilde en suPasswordFile=~/.vnc/passwd
cadena, ya que es un argumento paraecho
que se parece a una asignación de variables.La cadena
--PasswordFile=~/.vnc/passwd
no parece una asignación de variable ya que la cadena--PasswordFile
no es un nombre de variable válido.Tenga en cuenta que
bash
no hace esto cuando se ejecuta en modo POSIX, y que otros shells, comozsh
,ksh
oyash
no lo hacen de forma predeterminada (zsh
tiene unamagicequalsubst
opción para que la expansión de tilde se realice después de signos iguales sin comillas (=
)).Si desea asegurarse de que la ruta del directorio inicial del usuario actual se expanda correctamente como parte de un argumento a un comando, use el
$HOME
valor en lugar de la tilde:Los "comandos de declaración antes mencionados" se hace referencia en el manual son construidos en los comandos
alias
,declare
,typeset
,export
,readonly
, ylocal
.fuente
bash --posix -c '"export" a=~; printf "%s\n" "$a"'
salidas~
.~
expansión enalias a=~
sería un error de conformidad POSIX (y no es útil). Pero así es como lo hizo ksh88 (eso cambió en ksh93) y es probablemente por qué bash, zsh y pdksh también lo hacen. Por qué loyash
que se escribió en contra de la especificación POSIX no lo hace.=
un argumento. Entonces la expansión de tilde está al comienzo de una palabra y la pregunta es discutible.x0vncserver
,x0vncserver --PasswordFile file
no funciona, necesita--PasswordFile=file
.