बैकस्लैश के साथ शेल कमांड क्यों शुरू करें?


जवाबों:


200
alias curl='curl --some --default --options'

यदि आपके पास एक उपनाम है curlऔर आप इसका उपयोग नहीं करना चाहते हैं, तो सामने एक बैकस्लैश डालना उपनाम को निष्क्रिय कर देता है और कर्ल बाइनरी को सीधे चलाता है।

ध्यान दें कि यह केवल एक इंटरैक्टिव शेल पर लागू होता है। उपनाम स्क्रिप्ट में प्रभावी नहीं होते हैं इसलिए यह वहां अनावश्यक होगा।


4
उपनामों का उपयोग करने shopt -s expand_aliasesसे पहले उपनामों में उपनाम का उपयोग किया जा सकता है
एलेक्स

कॉर्शेल में @lbaby समान। आप इसके सामने एक बैकस्लैश डालकर एक संभावित कमांड उर्फ डीलिया करते हैं। कॉर्नशेल में यह बहुत आम है जब लोग कमांड प्रॉम्प्ट को परिभाषित करते हैं कि उनमें निर्देशिका का नाम है । ध्यान दें कि इस फ़ंक्शन की पहली पंक्ति `\ cd '$ @" "है।
डेविड डब्ल्यू।

1
यह ध्यान देने योग्य है कि नामित \curlकिसी भी शेल फ़ंक्शन को बायपास नहीं करता है curl। उसके लिए, आप bash बिल्ट-इन कमांड का उपयोग कर सकते हैं command:command curl ...
कीथ थॉम्पसन

7
लिखने \curl ...का एक आसान तरीका हैcommand curl ...
ग्लेन जैकमैन

ध्यान दें कि dash(और संभवतः अन्य गोले, हालांकि आप bashबिना सही हैं expand_aliases) स्क्रिप्ट में उपनामों का विस्तार करता है
एड्रियन गुंटर

163

बोर्न / पोसिक्स) शेल स्पेसिफिकेशन का कहना है कि एक इंटरैक्टिव शैल में अन्य उपनाम प्रतिस्थापन को दबा दिया जाता है जब कमांड शब्द का कोई भी वर्ण उद्धृत किया जाता है। एक बैकस्लैश ऐसा करने का एक तरीका है, लेकिन उद्धरण के लिए अन्य प्रसिद्ध तरीके भी हैं: एकल और दोहरे उद्धरण। निम्नलिखित में से सभी अन्य उपनाम प्रतिस्थापन को दबाएंगे:

 \curl
 cur\l
 \c\u\r\l
 "c"url
 "curl"
 "c""u""r""l"
 'curl'
 'cu'"rl"

का उपयोग करना \curlसबसे आम और पठनीय तरीका है। चूंकि यह एक मानकीकृत विशेषता है, आप इसे सभी बॉर्न-हेरिटेज गोले में काम करने की उम्मीद कर सकते हैं।

\curlएक TeX कमांड की तरह एक सा दिखता है, है ना? :-)


14
+1 विशिष्ट कारण \curlबताने के लिए कि एक ही नाम के एक उपनाम को क्यों दरकिनार किया जाता है; ध्यान दें कि केवल उपनामों को इस तरह से बाईपास किया जाता है, शेल फ़ंक्शन नहीं ; या तोcommand curl ... बाईपास सुनिश्चित करेगा ।
mklement0

1
मैं अंतिम वाक्य का बिंदु नहीं देखता। वैसे, आप केवल उपनामों को दरकिनार करने का उल्लेख करते हैं , लेकिन किसी भी प्रकार के उद्धरण कीवर्ड
गनीउरफ_गनीउरफ

@ mklement0 काफी सुनिश्चित नहीं ... command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"प्रिंट्स Not command, lol!एक्स 3.
एड्रियन गुंटर

3
@ AdrianGünter: हाँ, यदि आप command स्वयं को शेल फ़ंक्शन से बदलते हैं, तो आप तंत्र को हरा रहे हैं। जैसा कि आपके उदाहरण से पता चलता है कि \ यह कार्य नहीं करता है , जैसा कि कहा गया है। एक गैर-आत्म-पराजित उदाहरण date() { echo 'not date'; }; date; command date:। आप दुर्भावनापूर्ण बारे में चिंतित हैं छेड़छाड़ के साथ command, देखने के stackoverflow.com/a/35931876/45375
mklement0

@ mklement0 मुझे वह सब समझ में आ रहा है, लेकिन मेरा कहना यह है कि यदि कोई गारंटी नहीं दे सकता कि कोई अन्य कमांड नाम एक फ़ंक्शन के रूप में मौजूद नहीं है (यानी, आपके निष्पादन पर्यावरण पर नियंत्रण की कमी है), तो कोई भी इस पर भरोसा नहीं कर सकता है commandओवरराइड नहीं होना चाहिए। अपने स्वयं के लिंक से:Thus, with no control over the execution environment, you cannot write shell scripts that are fully immune to tampering, unless you know that your code will be executed by dash, ksh, or bash (with the workaround in place)
एड्रियन गंटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.