जब CLI तर्क डैश के साथ शुरू होता है तो टिल्ड (~) का विस्तार क्यों नहीं होता है?


9

मैंने 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

ऐसा क्यों है? यदि एक डैश से तर्क शुरू होता है तो शेल टिल्ड का विस्तार करने से इनकार क्यों करता है? मैंने सोचा कि जब तक यह उद्धृत नहीं किया जाता है, तब तक टिल्ड का हमेशा विस्तार होगा, लेकिन जाहिर है कि एक और नियम है जो खेल में आता है?



जवाबों:


13

यह bashअपने मैनुअल में वर्णित शेल की ख़ासियत है :

बैश भी शब्दों पर टिल्ड विस्तार करता है, जो चर असाइनमेंट की शर्तों को पूरा करता है (जैसा कि PARAMETERS के तहत ऊपर वर्णित है) जब वे साधारण कमांड के तर्क के रूप में दिखाई देते हैं। बैश ऐसा नहीं करता है, ऊपर सूचीबद्ध घोषणा आदेशों को छोड़कर, जब पॉज़िक्स मोड में।

इसका मतलब है कि यह आपके स्ट्रिंग में टिल्ड का विस्तार bash करेगाPasswordFile=~/.vnc/passwd , क्योंकि यह एक तर्क है echoजो एक चर असाइनमेंट की तरह दिखता है।

स्ट्रिंग --PasswordFile=~/.vnc/passwdएक चर असाइनमेंट की तरह नहीं दिखता है क्योंकि स्ट्रिंग --PasswordFileएक मान्य चर नाम नहीं है।

ध्यान दें कि bashPOSIX मोड में चलने पर ऐसा नहीं होता है, और यह कि अन्य गोले, डिफ़ॉल्ट रूप से ऐसा नहीं करते हैं zsh, kshया yashनहीं करते हैं ( टिल्ड विस्तार के लिए zshएक magicequalsubstविकल्प है, जो बिना चिह्नित समान संकेतों के बाद भी प्रदर्शन किया जाता है =)।

यदि आप यह सुनिश्चित करना चाहते हैं कि किसी कमांड के तर्क के हिस्से के रूप में वर्तमान उपयोगकर्ता का होम डाइरेक्टरी पथ ठीक से विस्तारित है, $HOMEतो टिल्ड के बजाय मान का उपयोग करें :

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

"घोषणा ऊपर सूचीबद्ध कमांड" करने के लिए मार्गदर्शन आदेशों में निर्माण कर रहे हैं के लिए भेजा alias, declare, typeset, export, readonly, और local


1
+1 | मैं ऐसा नहीं सोचूंगा।
LinuxSecurityFreak

हालांकि ध्यान दें: bash --posix -c '"export" a=~; printf "%s\n" "$a"'आउटपुट ~
स्टीफन चेज़लस

2
ध्यान दें कि ~विस्तारित किया जा रहा alias a=~है, POSIX अनुरूपता बग (और उपयोगी नहीं है) होगा। लेकिन यह है कि कैसे ksh88 यह किया (कि ksh93 में बदल गया) और शायद इसलिए bash, zsh और pdksh इसे भी करते हैं। क्यों yashजो POSIX कल्पना के खिलाफ लिखा गया था वह नहीं करता है।
स्टीफन चेज़लस

यह सही उत्तर है, लेकिन सही दृष्टिकोण विकल्प तर्क को केवल =एक तर्क में उपयोग करने के बजाय एक अलग तर्क के रूप में एक अलग तर्क के रूप में आपूर्ति करना होगा । फिर एक शब्द की शुरुआत में टिल्ड का विस्तार होता है और सवाल मूक है।
JdeBP

1
@ जेडीबीपी, जैसा कि होता है, के मामले में x0vncserver, x0vncserver --PasswordFile fileकाम नहीं करता है, आपको जरूरत है --PasswordFile=file
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.