Я потерял пару часов, пытаясь запустить сервер VNC (x0vncserver), и клиент отказался подключиться со странным сообщением, которое
No password configured for VNC Auth
Сервер также печатает эту ошибку
SVncAuth: opening password file '~/.vnc/passwd' failed
Хорошо, я потратил много времени, пока не понял, что тильда не была расширена ни оболочкой, ни x0vncserver. Затем я провел эти тесты
$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd
Но
$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd
Это почему? Почему оболочка отказывается расширять тильду, если аргумент начинается с тире? Я думал, что тильда всегда будет расширяться до тех пор, пока она не будет указана, но, видимо, есть еще одно правило, которое вступает в игру?
Ответы:
Это особенность
bash
оболочки, описанная в ее руководстве:Это означает, что
bash
это расширит тильду в вашейPasswordFile=~/.vnc/passwd
строке, так как это аргумент,echo
который выглядит как присваивание переменной.Строка
--PasswordFile=~/.vnc/passwd
не похожа на присвоение переменной, поскольку строка--PasswordFile
не является допустимым именем переменной.Обратите внимание, что
bash
этого не происходит при работе в режиме POSIX, и что другие оболочки, напримерzsh
,ksh
илиyash
не делают этого по умолчанию ( хотяzsh
естьmagicequalsubst
опция для раскрытия тильды после знаков равенства без кавычек (=
), хотя).Если вы хотите убедиться, что путь к домашнему каталогу текущего пользователя правильно раскрыт как часть аргумента команды, используйте
$HOME
значение вместо тильды:«Декларация команды , перечисленные выше» , упомянутые в руководстве, встроенные команды
alias
,declare
,typeset
,export
,readonly
, иlocal
.источник
bash --posix -c '"export" a=~; printf "%s\n" "$a"'
выводы~
.~
что расширение вalias a=~
было бы ошибкой соответствия POSIX (и это не полезно). Но именно так ksh88 сделал это (что изменилось в ksh93) и, вероятно, поэтому bash, zsh и pdksh делают это также. Почему то,yash
что было написано против спецификации POSIX, этого не делает.=
в один аргумент. Тогда расширение тильды находится в начале слова, и вопрос спорный.x0vncserver
,x0vncserver --PasswordFile file
не работает, вам нужно--PasswordFile=file
.