जवाबों:
यह एक बैकटिक है । एक बैकटिक एक उद्धरण चिन्ह नहीं है। इसका एक बहुत ही खास अर्थ है। बैकटिक्स के बीच आप जो कुछ भी टाइप करते हैं उसका मूल्यांकन मुख्य कमांड (जैसे 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, यदि आप कभी भी एक बैकटिक का शाब्दिक उपयोग करना चाहते हैं, जैसे एक स्ट्रिंग में, आप \
इससे पहले बैकस्लैश ( ) लगाकर इससे बच सकते हैं ।
$()
ज्यादातर स्थितियों में उपयोग करने के लिए एक अच्छा अभ्यास है, लेकिन यह बैकटिक्स को एक बदतर चीज नहीं बनाता है। व्यावहारिक उद्देश्यों के लिए, किसी को यह स्वीकार करना होगा कि वे कमांड लाइन पर टाइप करने के लिए बहुत तेज़ हैं (कम से कम 5 की तुलना में 2 कीस्ट्रोक्स शामिल हैं Shift
)।
$( )
टाइप करना आसान है ` `
।
मैं यहां कुछ और बिंदु जोड़ना चाहूंगा।
बैकटिक `…`
को वास्तव में कमांड प्रतिस्थापन कहा जाता है । कमांड प्रतिस्थापन का उद्देश्य उस कमांड का मूल्यांकन करना है जो बैकटिक के अंदर रखा गया है और वास्तविक कमांड के तर्क के रूप में अपना परिणाम प्रदान करता है।
कमांड प्रतिस्थापन दो तरीकों से किया जा सकता है एक का उपयोग कर रहा है $(…)
और दूसरा है `…`
। दोनों समान काम करते हैं, लेकिन $(…)
रूप आधुनिक तरीका है और इसमें अधिक स्पष्टता और पठनीयता है।
इसलिए
sudo chown $(id -u) /somedir
दूसरे पर पसंद किया जा सकता है।
और एक और बात जो आपको यहां ध्यान देने की जरूरत है वह है, बैश डॉक्यूमेंट में बताए गए नियमों के अनुसार बैश के नियमों के साथ कमांड प्रतिस्थापन संबंध ।
यदि प्रतिस्थापन दोहरे कोट्स के भीतर दिखाई देता है, तो शब्द विभाजन और फ़ाइल नाम विस्तार परिणामों पर नहीं किए जाते हैं।
$(...)
बेहतर घोंसले।
$()
और "``"
उसी तरह से काम नहीं करते हैं
स्पष्टीकरण का एक नोट शायद ही कभी कवर किया गया हो:
बैकटिक्स (कभी-कभी इसे ग्रेव्स भी कहा जाता है क्योंकि यह फ्रेंच और अन्य भाषाओं में एक आम लहजे के रूप में दोगुना है) केवल मानक आउटपुट का विकल्प देता है , लेकिन मानक त्रुटि का नहीं।
तो पिछले उदाहरण को जारी रखने के लिए:
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 :)
बैकटिक `संलग्न स्ट्रिंग की सामग्री को चलाता है, इसलिए कुछ इस तरह से
file `which hostname`
होस्टनाम कमांड के लिए रास्ता खोज लेंगे, और फिर आपको बताएंगे कि यह कैसे बनाया गया था।
आपके द्वारा अपने प्रश्न में लगाई गई कमांड id -u
प्रभावी उपयोगकर्ता आईडी प्राप्त करने के लिए चलती है, और फिर उस उपयोगकर्ता के लिए / somedir के स्वामित्व को बदल देती है।
बैकटिक्स कमांड प्रतिस्थापन से मिलता जुलता है। यह बैकटिक्स सिंटेक्स पुरातन है, और पता है कि दो कोष्ठक के साथ डॉलर का चिह्न आम है $()
:।
कमांड प्रतिस्थापन एक कमांड को निष्पादित करने के लिए समर्पित सिंटैक्स के साथ एक एकल ऑपरेशन है और इसके आउटपुट को बाद के उपयोग के लिए एक चर में संग्रहीत किया जाता है।
thedate=$(date)
हम तब परिणाम प्रिंट कर सकते हैं: 'तिथि% s \ n' "$ थ्रेडेट" है।
$()
।date
।$(date)
जो इसका आउटपुट प्रतिस्थापन है।printf
उपरोक्त कमांड के अनुसार, वेरिएबल द्वारा आउटपुट वैल्यू होल्ड को प्रदर्शित करते हैं ।
$(your expression)
का एक बेहतर तरीका है कि$()
आप भावों को घोंसला बनाने की अनुमति दें। उदाहरण के लिए:cd $(dirname $(type -P touch))
आपकोtouch
कमांड में निर्देशिका में शामिल किया जाएगा