व्यवस्थागत \ {पुनः आरंभ, स्थिति} \ sshd \ _ क्यों नहीं करता है; काम?


14

गूंज के माध्यम से पारित होने पर उपरोक्त कमांड का आउटपुट है:

# echo systemctl\ {restart,status}\ sshd\;
systemctl restart sshd; systemctl status sshd;

भले ही मैं टर्मिनल पर आउटपुट पेस्ट करता हूं, कमांड काम करता है। लेकिन जब मैं सीधे कमांड चलाने की कोशिश करता हूं, मुझे मिलता है:

# systemctl\ {restart,status}\ sshd\;
bash: systemctl restart sshd;: command not found...

मेरे दो सवाल हैं ।।

  1. वास्तव में प्रतिस्थापन और विस्तार की यह विधि क्या कहलाती है? (ताकि मैं इस पर शोध कर सकूं और इसके बारे में अधिक जान सकूं और इसका सही इस्तेमाल कैसे करूं)।
  2. मैंने यहां क्या गलत किया? यह काम क्यों नहीं करता है?

जवाबों:


26

यह खोल में किया गया ब्रेस विस्तार का एक रूप है । ब्रेस-एक्सपेंशन आइडिया सही है, लेकिन जिस तरह से इसका इस्तेमाल किया गया वह गलत है। जब आप करने का मतलब:

systemctl\ {restart,status}\ sshd\;

खोल व्याख्या करता है systemctl restart sshd; एक लंबी कमांड के रूप में करता है और इसे चलाने की कोशिश करता है, और यह इसे चलाने के लिए एक द्विआधारी का पता नहीं लगा सकता है। क्योंकि इस स्तर पर, शेल पूरी तरह से तर्कों के साथ कमांड बनाने से पहले कमांड लाइन में आइटम को टोकन करने की कोशिश करता है - लेकिन यह अभी तक नहीं हुआ है।

ऐसे ज्ञात विस्तार मूल्यों के लिए, आप उपयोग कर सकते हैं evalऔर फिर भी सुरक्षित रह सकते हैं, लेकिन इसके साथ विस्तार करने के लिए आप क्या कर रहे हैं, यह सुनिश्चित करें।

eval systemctl\ {restart,status}\ sshd\;

लेकिन मैं इसके बजाय एक लूप का उपयोग करना चाहूंगा for, इसके बजाय एक-लाइनर लिखने या उपयोग करने की कोशिश करूंगा eval:

for action in restart status; do
    systemctl "$action" sshd
done

19

इसे ब्रेस एक्सपेंशन (जैसा कि टैग इंगित करता है) कहा जाता है ।

मैंने यहां क्या गलत किया? यह काम क्यों नहीं करता है?

बैश में कमांड लाइन को पढ़ने और निष्पादित करने में शामिल चरणों पर विचार करें (उदाहरण के लिए):

  1. एक पंक्ति पढ़ता है
  2. घटक सरल कमांड में एक संभावित यौगिक कमांड को पार्स करता है
  3. सरल आदेशों पर विभिन्न विस्तार (ब्रेस विस्तार, शब्द विभाजन, ग्लोबिंग, आदि) करता है।
  4. फिर सरल कमांड निष्पादित करता है (स्पष्टता के लिए छोड़े गए अन्य चरणों के साथ)।

आप जो करने की कोशिश कर रहे हैं वह (3) से (2) प्रभावित है। चरणबद्धता ;(चरण 2) पर आधारित है, जब यह यौगिक आदेशों को पार्स कर रहा है। जब तक ब्रेस विस्तार के लिए (3) हो रहा है, तब तक कंपाउंड कमांड बनाने की कोशिश करने और बनाने में पहले ही बहुत देर हो चुकी है।


6

पहली पंक्ति

echo systemctl\ {restart,status}\ sshd\;

3 टोकन के रूप में विस्तार करें

  • गूंज
  • systemctl पुनरारंभ sshd;
  • systemctl स्टेटस sshd;

तब अंतिम दो टोकन गूंजते हैं, और यह ठीक दिखता है।

इसी तरह दूसरी पंक्ति

systemctl\ {restart,status}\ sshd\;

2 टोकन के रूप में फैलता है

  • systemctl पुनरारंभ sshd;
  • systemctl स्टेटस sshd;

और बैश एक निष्पादन योग्य देखने की कोशिश करते हैं systemctl restart sshd;जो इसे नहीं मिल सका।

आप eval systemctl\ {restart,status}\ sshd\;अनपेक्षित से सावधान रहकर अंधेरे पक्ष पर अपनी यात्रा शुरू करने का प्रयास कर सकते हैं ।


तो, समाधान शब्द बंटवारे, सही होगा? यह कैसे किया जा सकता है?
सोमनाथ सिन्हा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.