Sh -c कमांड क्या है?


30

मुझे sh -cकमांड का पता चला । मैंने इसे यहां पोस्ट करने से पहले पाया था, लेकिन मैं Google से कोई भी पोस्ट नहीं पा रहा हूं जो इसे समझाए, इसलिए मैं जानना चाहता हूं कि यह क्या है और इसका पूरा सिंटैक्स क्या है।

जवाबों:


34

shप्रोग्राम shको इंटरप्रेटर कहते हैं और -cध्वज का अर्थ है इस प्रोग्राम द्वारा व्याख्या की गई निम्न कमांड को निष्पादित करें।

उबंटू में, shआमतौर पर सहानुभूति होती है /bin/dash, जिसका अर्थ है कि यदि आप sh -cडैश शेल के साथ कमांड निष्पादित करते हैं, तो इसका उपयोग कमांड को बैश करने के बजाय निष्पादित करने के लिए किया जाएगा। के साथ बुलाया शेल shसिम्लिंक पर निर्भर करता है - आप के साथ पता लगा सकते हैं readlink -e $(which sh)sh -cजब आप बैश के बजाय विशेष रूप से उस शेल के साथ कमांड निष्पादित करना चाहते हैं तो आपको इसका उपयोग करना चाहिए ।

आप -cअन्य व्याख्याताओं के साथ भी इस वाक्यविन्यास ( ध्वज) का उपयोग कर सकते हैं । इसका एक क्लासिक उपयोग (@wwinksl द्वारा इंगित किया गया है कि सुडो के साथ काम न करने की पुनर्निर्देशन की समस्या के आसपास जाना है (यहां आप उपयोग कर सकते हैं bash -cया sh -c)

sudo sh -c 'echo "foo" > /home/bar'

फ़ाइल लिखेंगे barपाठ वाले fooको /home/जबकि, sudo echo "foo" > /home/barविफल रहता है के रूप में बहुत अच्छी तरह से यहाँ समझाया

कमांड स्ट्रिंग के चारों ओर 'सिंगल कोट्स' का उपयोग करना महत्वपूर्ण है, अन्यथा वर्तमान शेल आपके द्वारा इंटरप्रेटर को भेजे जाने से पहले इसे विस्तारित करने का प्रयास करेगा

उदाहरण के लिए (अजगर के साथ जब तक मैं एक कमांड के बारे में सोचता हूं जो डैश में अलग-अलग परिणाम देगा ...)

$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0

क्या आप इसका उपयोग करने का एक उदाहरण प्रदान कर सकते हैं sh -c? अतिरिक्त अच्छा होगा यदि यह स्थितिगत मापदंडों के असाइनमेंट को प्रदर्शित करता है जो के -cहिस्से में उल्लिखित हैं man sh
edwinksl

15

-cतर्क है:

मानक इनपुट के बजाय कमांड_स्ट्रिंग ऑपरेंड से कमांड पढ़ें। विशेष पैरामीटर 0 को कमांड =name ऑपरेंड से और पोजीशन पैरामीटर ($ 1, $ 2, आदि) को शेष तर्क ऑपरेंड से सेट किया जाएगा।

shआर्गुमेंट्स के अन्य विवरणों को चलाकर पाया जा सकता है:

$ man sh

एक तर्क के रूप में स्ट्रिंग का उपयोग करने का एक उदाहरण है:

$ sh -c "echo This is a test string"

यह एक अधिक विस्तृत sh -cउदाहरण है। यह Google ड्राइव से एक दस्तावेज़ डाउनलोड करेगा और इसे डेस्कटॉप पर संपादन के लिए खोल देगा:

$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"

11

sh -c( उबंटू में) एक गैर-लॉगिन , गैर-संवादात्मक सत्र को जन्म देता है ।shdash

आदेश निम्नलिखित है कि खोल सत्र में चलाया जाएगा, यह तर्क (स्थितीय पैरामीटर) के रूप में 0 (इलाज किया जाएगा ARGV0), और कहा कि आदेश के लिए तर्क (के रूप में शेष भाग ARGV0), 1 से शुरू ( ARGV1, ARGV2, ...)।

आप इस तरह के सत्र में चलने के लिए अनुमति दी गई विशिष्ट शेल विशेषताओं का भी उपयोग कर सकते हैं। उदाहरण के लिए कमांड को अलग-अलग कमांड का उपयोग करके ;, कमांड ग्रुपिंग का उपयोग करते हुए {}, एक और उपधारा के साथ स्पॉन करें (), और इसी तरह। इनका उपयोग पूर्व में उल्लिखित तर्क की परिभाषा / उदाहरणों को थोड़ा बदल सकता है।


बस ध्यान देने योग्य बात यह है कि जो सुविधाएँ केवल इंटरएक्टिव शेल के लिए विशिष्ट हैं (डिफ़ॉल्ट रूप से), जैसे इतिहास विस्तार, source-ing ~/.bashrcऔर /etc/bash.bashrcआदि इस सत्र में उपलब्ध नहीं होंगे क्योंकि यह गैर-इंटरैक्टिव है । आप -iविकल्प का उपयोग करके एक इंटरैक्टिव सत्र व्यवहार (लगभग) का अनुकरण कर सकते हैं :

sh -ic ...

इसी तरह, सुविधाओं है कि के लिए विशिष्ट हैं लॉगिन केवल (डिफ़ॉल्ट रूप से) के गोले जैसे sourceकी -ing ~/.profile(दिया ~/.bash_profileऔर ~/.bash_loginमौजूद नहीं है) और /etc/profileके रूप में खोल एक है नहीं किया जाएगा गैर लॉगिन खोल। आप -lविकल्प का उपयोग करके लॉगिन-शेल्स व्यवहार का अनुकरण कर सकते हैं :

sh -lc ...

लॉगिन और इंटरैक्टिव सत्र दोनों का अनुकरण करने के लिए:

sh -lic ...

+1 "sh -c एक गैर-लॉगिन, गैर-संवादात्मक श के सत्र को जन्म देता है"
JSON C11
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.