Tire ile başlayan CLI argümanıyla birlikte kullanıldığında neden tilde (~) genişlemiyor?


9

VNC sunucusu (x0vncserver) çalıştırmaya çalışırken birkaç saat kaybettim ve istemci garip mesajla bağlanmayı reddetti

No password configured for VNC Auth

Sunucu ayrıca bu hatayı yazdırır

 SVncAuth:    opening password file '~/.vnc/passwd' failed

Tamam, tilde'nin ne kabuk ne de x0vncserver tarafından genişletilmediğini fark edene kadar çok zaman harcadım. Sonra bu testleri yaptım

$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd

Fakat

$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd

Neden? Argüman bir çizgi ile başlıyorsa neden kabuk tilde genişletmeyi reddediyor? Tilde'nin alıntı olmadığı sürece her zaman genişleyeceğini düşündüm, ama görünüşe göre oyuna giren başka bir kural var mı?


İlgili:
Zilde

Yanıtlar:


13

Bu, bashkılavuzunda açıklanan kabuğun bir özelliğidir :

Bash ayrıca, basit komutlara argüman olarak göründüklerinde değişken atama koşullarını (yukarıda PARAMETERS altında açıklandığı gibi) karşılayan sözcüklerde tilde genişletme gerçekleştirir. Bash, posix modundayken yukarıda listelenen bildirim komutları dışında bunu yapmaz.

Bu , değişken atamasına benzeyen bir argüman olduğu için dizenizdeki tilde bash değerini genişleteceği anlamına gelir .PasswordFile=~/.vnc/passwdecho

Dize geçerli bir değişken adı olmadığından --PasswordFile=~/.vnc/passwddize değişken atamasına benzemiyor --PasswordFile.

Not bashPOSIX modunda çalışırken bu yapmaz ve bu diğer kabuklar gibi zsh, kshya da yashvarsayılan olarak bunu yapmayın ( zshbir etmiştir magicequalsubstyaklaşık işareti genişlemesi için seçenek tırnaksız eşit işaretinin sonra yapılacak ( =) olsa da).

Geçerli kullanıcının giriş dizini yolunun, bir komutun bağımsız değişkeninin bir parçası olarak düzgün bir şekilde genişletildiğinden emin olmak istiyorsanız $HOME, tilde yerine değeri kullanın:

echo --PasswordFile="$HOME/.vnc/passwd"

"Yukarıda listelenen beyan komutları" el komutları inşa edilmiş anılan alias, declare, typeset, export, readonly, ve local.


1
+1 | Bunu düşünmezdim.
LinuxSecurityFreak

Gerçi not: bash --posix -c '"export" a=~; printf "%s\n" "$a"'çıktılar ~.
Stéphane Chazelas

2
Not olduğu ~genişletilmiş varlık alias a=~bir POSIX uygunluk hata olması (ve kullanışlı değildir) olacaktır. Ama ksh88 bunu yaptı (ksh93'te değişti) ve muhtemelen bash, zsh ve pdksh de bunu yapıyor. yashPOSIX spesifikasyonuna karşı yazılan neden bunu yapmıyor.
Stéphane Chazelas

Bu doğru cevaptır, ancak doğru yaklaşım , seçenek argümanını =tek bir argüman kullanarak seçenekle birleştirmek yerine, seçenek argümanını ayrı bir argüman olarak sunmak olurdu . Sonra tilde genişleme bir sözcüğün başlangıcındadır ve soru tartışmalıdır.
JdeBP

1
@JdeBP, tesadüfen de, söz konusu x0vncserver, x0vncserver --PasswordFile fileiş, sen gerekmez --PasswordFile=file.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.