Straciłem kilka godzin, próbując uruchomić serwer VNC (x0vncserver), a klient odmówił połączenia z dziwnym komunikatem, że
No password configured for VNC Auth
Serwer drukuje również ten błąd
SVncAuth: opening password file '~/.vnc/passwd' failed
Ok, zmarnowałem dużo czasu, aż zdałem sobie sprawę, że tylda nie została powiększona ani przez powłokę, ani przez x0vncserver. Potem przeprowadziłem te testy
$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd
Ale
$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd
Dlaczego? Dlaczego powłoka odmawia rozwinięcia tyldy, jeśli argument zaczyna się od myślnika? Myślałem, że tylda zawsze będzie się rozwijać, dopóki nie będzie cytowana, ale najwyraźniej istnieje inna zasada, która wchodzi w grę?
Odpowiedzi:
Jest to osobliwość
bash
powłoki opisanej w jej instrukcji:Oznacza to, że
bash
będzie rozwinąć tyldy wPasswordFile=~/.vnc/passwd
ciągu, ponieważ jest to argumentecho
, który wygląda jak przypisanie zmiennej.Ciąg
--PasswordFile=~/.vnc/passwd
nie wygląda jak przypisanie zmiennej, ponieważ--PasswordFile
nie jest prawidłową nazwą zmiennej.Zauważ, że
bash
nie robi tego, gdy pracuje w trybie POSIX, i że inne pociski, jakzsh
,ksh
alboyash
nie rób tego domyślnie (zsh
posiadamagicequalsubst
opcję ekspansji tyldy być wykonywane po nienotowanych jednakowych znaków (=
) choć).Jeśli chcesz się upewnić, że ścieżka do katalogu domowego bieżącego użytkownika jest poprawnie rozwinięta jako część argumentu polecenia, użyj
$HOME
wartości zamiast tyldy:W „Polecenia deklaracji wymienione powyżej”, o których mowa w instrukcji są wbudowane w poleceniach
alias
,declare
,typeset
,export
,readonly
, ilocal
.źródło
bash --posix -c '"export" a=~; printf "%s\n" "$a"'
wyniki~
.~
że rozwijane w toalias a=~
byłby błąd zgodności z POSIX (i nie jest użyteczny). Ale tak właśnie zrobił ksh88 (zmieniło się to w ksh93) i prawdopodobnie dlatego robią to także bash, zsh i pdksh. Dlaczego to,yash
co zostało napisane przeciwko specyfikacji POSIX, tego nie robi.=
jednego argumentu. Zatem rozwinięcie tyldy jest na początku słowa, a pytanie jest dyskusyjne.x0vncserver
,x0vncserver --PasswordFile file
nie działa, potrzebujesz--PasswordFile=file
.