आदेशों में `(backquote / backtick) का क्या अर्थ है?


159

मैं निम्नलिखित आदेश पर आया:

sudo chown `id -u` /somedir

और मुझे आश्चर्य है: `प्रतीक का अर्थ क्या है । मैंने उदाहरण के लिए देखा कि जब ऊपर की कमांड अच्छी तरह से काम करती है, तो नीचे वाला नहीं करता है:

sudo chown 'id -u' /somedir

जवाबों:


199

यह एक बैकटिक हैएक बैकटिक एक उद्धरण चिन्ह नहीं है। इसका एक बहुत ही खास अर्थ है। बैकटिक्स के बीच आप जो कुछ भी टाइप करते हैं उसका मूल्यांकन मुख्य कमांड (जैसे chownआपके उदाहरणों) से पहले शेल द्वारा किया जाता है (निष्पादित) , और उस निष्पादन के आउटपुट का उपयोग उस कमांड द्वारा किया जाता है, जैसे कि आप उस जगह पर उस आउटपुट को टाइप करेंगे। कमांड लाइन।

तो क्या

sudo chown `id -u` /somedir

प्रभावी रूप से चलता है ( आपकी उपयोगकर्ता आईडी के आधार पर ):

sudo chown 1000 /somedir
  \    \     \     \
   \    \     \     `-- the second argument to "chown" (target directory)
    \    \     `-- your user ID, which is the output of "id -u" command
     \    `-- "chown" command (change ownership of file/directory)
      `-- the "run as root" command; everything after this is run with root privileges

इस सवाल पर एक नज़र डालें कि क्यों, कई स्थितियों में, बैकटिक्स का उपयोग करना एक अच्छा विचार नहीं है।

Btw, यदि आप कभी भी एक बैकटिक का शाब्दिक उपयोग करना चाहते हैं, जैसे एक स्ट्रिंग में, आप \इससे पहले बैकस्लैश ( ) लगाकर इससे बच सकते हैं ।


36
यह बहुत अच्छी तरह से backticks की व्याख्या करता है, लेकिन इसका उपयोग करने $(your expression)का एक बेहतर तरीका है कि $()आप भावों को घोंसला बनाने की अनुमति दें। उदाहरण के लिए: cd $(dirname $(type -P touch))आपको touchकमांड में निर्देशिका में शामिल किया जाएगा
खाजा मिनहाजुद्दीन

11
@KhajaMinhajuddin आप निश्चित रूप से घोंसले के शिकार के बारे में सही हैं - उपर्युक्त प्रश्न इसे विस्तार से शामिल करता है। लेकिन भले ही मुझे लगता है कि यह $()ज्यादातर स्थितियों में उपयोग करने के लिए एक अच्छा अभ्यास है, लेकिन यह बैकटिक्स को एक बदतर चीज नहीं बनाता है। व्यावहारिक उद्देश्यों के लिए, किसी को यह स्वीकार करना होगा कि वे कमांड लाइन पर टाइप करने के लिए बहुत तेज़ हैं (कम से कम 5 की तुलना में 2 कीस्ट्रोक्स शामिल हैं Shift)।
rozcietrzewiacz

2
@rozcietrzewiacz आपकी बाद की टिप्पणी संभवतः अधिकांश कीबोर्ड के लिए सही है लेकिन कम से कम एक फ्रांसीसी कीबोर्ड पर $( )टाइप करना आसान है ` `
जलीगेरे

1
@KhajaMinhajuddin आप बैकस्टिक्स को घोंसला बना सकते हैं, लेकिन आपको बैकटिक्स के दूसरे स्तर से बचने की आवश्यकता है, और दूसरे स्तर के लिए आपको 3 बैकटिक्स की आवश्यकता है, 3 स्तर के 5 बैकस्टिक्स, 4 वें स्तर के 7, और सी के घोंसले के शिकार की आवश्यकता है।
जस्टिन सीबी

66

मैं यहां कुछ और बिंदु जोड़ना चाहूंगा।

बैकटिक `…`को वास्तव में कमांड प्रतिस्थापन कहा जाता है । कमांड प्रतिस्थापन का उद्देश्य उस कमांड का मूल्यांकन करना है जो बैकटिक के अंदर रखा गया है और वास्तविक कमांड के तर्क के रूप में अपना परिणाम प्रदान करता है।

कमांड प्रतिस्थापन दो तरीकों से किया जा सकता है एक का उपयोग कर रहा है $(…)और दूसरा है `…`। दोनों समान काम करते हैं, लेकिन $(…)रूप आधुनिक तरीका है और इसमें अधिक स्पष्टता और पठनीयता है।

इसलिए

sudo chown $(id -u) /somedir

दूसरे पर पसंद किया जा सकता है।

और एक और बात जो आपको यहां ध्यान देने की जरूरत है वह है, बैश डॉक्यूमेंट में बताए गए नियमों के अनुसार बैश के नियमों के साथ कमांड प्रतिस्थापन संबंध ।

यदि प्रतिस्थापन दोहरे कोट्स के भीतर दिखाई देता है, तो शब्द विभाजन और फ़ाइल नाम विस्तार परिणामों पर नहीं किए जाते हैं।


8
इसके अलावा, $(...)बेहतर घोंसले।
Kusalananda

$()और "``"उसी तरह से काम नहीं करते हैं
कुन

10

स्पष्टीकरण का एक नोट शायद ही कभी कवर किया गया हो:

बैकटिक्स (कभी-कभी इसे ग्रेव्स भी कहा जाता है क्योंकि यह फ्रेंच और अन्य भाषाओं में एक आम लहजे के रूप में दोगुना है) केवल मानक आउटपुट का विकल्प देता है , लेकिन मानक त्रुटि का नहीं।

तो पिछले उदाहरण को जारी रखने के लिए:

file `which hostname`

उम्मीद के मुताबिक काम करेंगे, लेकिन इसमें:

file `which hostnameX`

whichएक त्रुटि लौटाएगा, और यह आउटपुट मानक त्रुटि पर जाता है, बजाय कमांड लाइन पर प्रतिस्थापित करने के file; कोई मानक आउटपुट नहीं होगा, जिसे आप चलाकर पुष्टि कर सकते हैं:

which hostnameX

which hostnameX 2>/dev/null

इस मामले में,

file `which hostnameX` 

दो त्रुटि संदेशों का उत्पादन करेगा (पहले एक के कारण, which hostnameXऔर दूसरा केवल एक पूर्व के बाद, फ़ाइल के कारण, जो पाता है कि फ़ाइल नाम गायब है और इसलिए, पूरी कमांड

अनिवार्य रूप से सिर्फ कम हो जाएगा:

file

जो निश्चित रूप से, बुरा उपयोग है, और उपयोग त्रुटि वापस करेगा।

(यदि आप इसे अपने आप से जांचना चाहें तो आप आजमा सकते हैं:

file `which hostnameX 2>/dev/null`    # just the file-command bad-usage error msg is printed

file `which hostnameX 2>/dev/null` 2>/dev/null  # now nothing is printed on the screen :)

4

बैकटिक `संलग्न स्ट्रिंग की सामग्री को चलाता है, इसलिए कुछ इस तरह से

file `which hostname`

होस्टनाम कमांड के लिए रास्ता खोज लेंगे, और फिर आपको बताएंगे कि यह कैसे बनाया गया था।

आपके द्वारा अपने प्रश्न में लगाई गई कमांड id -uप्रभावी उपयोगकर्ता आईडी प्राप्त करने के लिए चलती है, और फिर उस उपयोगकर्ता के लिए / somedir के स्वामित्व को बदल देती है।


2

इस प्रतीक का अर्थ है कि इसके अंदर जो कुछ भी है उसे उस कमांड के परिणाम के रूप में व्याख्या किया गया है।

उदाहरण के लिए:

$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three

threeनिर्देशिका में उपरोक्त परिणाम मेरी /homeनिर्देशिका में कॉपी किए जा रहे हैं ।


1

बैकटिक्स कमांड प्रतिस्थापन से मिलता जुलता है। यह बैकटिक्स सिंटेक्स पुरातन है, और पता है कि दो कोष्ठक के साथ डॉलर का चिह्न आम है $():।

कमांड प्रतिस्थापन क्या है?

कमांड प्रतिस्थापन एक कमांड को निष्पादित करने के लिए समर्पित सिंटैक्स के साथ एक एकल ऑपरेशन है और इसके आउटपुट को बाद के उपयोग के लिए एक चर में संग्रहीत किया जाता है।

दिनांक के साथ एक उदाहरण:

thedate=$(date)

हम तब परिणाम प्रिंट कर सकते हैं: 'तिथि% s \ n' "$ थ्रेडेट" है।

  1. कमांड प्रतिस्थापन सिंटैक्स है $()
  2. आज्ञा ही है date
  3. हम दोनों को मिलाते हैं $(date)जो इसका आउटपुट प्रतिस्थापन है।
  4. हम printfउपरोक्त कमांड के अनुसार, वेरिएबल द्वारा आउटपुट वैल्यू होल्ड को प्रदर्शित करते हैं ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.