Saya kehilangan beberapa jam mencoba menjalankan server VNC (x0vncserver) dan klien menolak untuk terhubung dengan pesan aneh yang
No password configured for VNC Auth
Server juga mencetak kesalahan ini
SVncAuth: opening password file '~/.vnc/passwd' failed
Ok, saya membuang banyak waktu sampai saya menyadari bahwa tilde tidak diperluas oleh shell, maupun oleh x0vncserver. Lalu saya menjalankan tes ini
$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd
Tapi
$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd
Mengapa demikian? Mengapa shell menolak untuk memperluas tilde jika argumen dimulai dengan tanda hubung? Saya pikir tilde akan selalu berkembang selama tidak dikutip, tetapi ternyata ada aturan lain yang berlaku?
Jawaban:
Ini adalah kekhasan
bash
shell yang dijelaskan dalam manualnya:Ini berarti bahwa
bash
akan memperluas tilde diPasswordFile=~/.vnc/passwd
string Anda , karena itu argumen untukecho
yang tampak seperti penugasan variabel.String
--PasswordFile=~/.vnc/passwd
tidak tampak seperti tugas variabel karena string--PasswordFile
bukan nama variabel yang valid.Catatan yang
bash
tidak melakukan ini ketika berjalan dalam mode POSIX, dan bahwa shell lain, sepertizsh
,ksh
atauyash
tidak melakukan ini secara default (zsh
memilikimagicequalsubst
opsi untuk ekspansi tilde yang akan dilakukan setelah tanda sama dengan tanda kutip (=
) meskipun).Jika Anda ingin memastikan bahwa jalur direktori home dari pengguna saat ini diperluas dengan benar sebagai bagian dari argumen ke perintah, gunakan
$HOME
nilai alih-alih tilde:The "perintah deklarasi yang tercantum di atas" sebagaimana dimaksud dalam manual yang dibangun di perintah
alias
,declare
,typeset
,export
,readonly
, danlocal
.sumber
bash --posix -c '"export" a=~; printf "%s\n" "$a"'
keluaran~
.~
yang diperluasalias a=~
akan menjadi bug kepatuhan POSIX (dan tidak berguna). Tapi begitulah ksh88 melakukannya (yang berubah di ksh93) dan mungkin itulah sebabnya bash, zsh dan pdksh melakukannya juga. Mengapayash
yang ditulis terhadap spesifikasi POSIX tidak melakukannya.=
menjadi satu argumen. Kemudian ekspansi tilde ada di awal kata dan pertanyaannya bisa diperdebatkan.x0vncserver
,x0vncserver --PasswordFile file
tidak berfungsi, Anda perlu--PasswordFile=file
.