एक कमांड लपेटना जिसमें एक और कमांड के लिए सिंगल और डबल कोट्स शामिल हैं


10

मैंने हाल ही में घड़ी के बारे में सीखा है , लेकिन इसे अपेक्षाकृत परिष्कृत कमांड के साथ काम करने में परेशानी हो रही है।

उदाहरण के लिए, मैं पूछना चाहूँगा watchपर निम्न आदेश को चलाने के लिए zshहर तीन सेकंड * :

for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done

जैसा कि आप ऊपर देख सकते हैं अन्य विशेष वर्णों के बीच एकल उद्धरण, दोहरे उद्धरण शामिल हैं।

इसलिए मैंने कोशिश की:

watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"

लेकिन फिर मुझे मिल गया:

x के लिए कोई मिलान नहीं मिला! @ # $ # ....; किया हुआ

मैंने सफलता के बिना अन्य संयोजनों की कोशिश की। यहाँ उन प्रयासों में से एक है:

watch -n 3 "for x in $(bjobs -w | grep pre_seg | cut -d' ' -f1); do bmod -R "rusage[mem=7000]" $x; done"

जिसके परिणामस्वरूप एक समान त्रुटि भी होती है।

किसी भी विचार कैसे यह काम करने के लिए?


* मैं भी समाधान है कि काम में intersted होगाbash

जवाबों:


16

सामान्य टिप: यदि आपके पास नेस्टिंग के दो स्तर हैं, तो इनर कमांड में सिंगल कोट्स का उपयोग करने से बचें और बाहरी कमांड के चारों ओर सिंगल कोट्स का उपयोग करें।

अतिरिक्त टिप: `…` कोड निष्पादित करने के लिए बैकटिक्स - - का उपयोग न करें , इसके बजाय इसके $(…)चारों ओर उपयोग करें । जब यह नेस्टेड कोट्स की बात आती है तो डॉलर-कोष्ठक बहुत ज्यादा DWIM ('मैं क्या मतलब है'); बैककौट्स में आर्कियन, शेल-डिपेंडेंट नियम हैं।

watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'

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

अधिक जटिल मामलों के लिए, या तो श्रमसाध्य रूप से उद्धरणों की गणना करें, या अस्थायी चर को परिभाषित करें।

cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'

यह उत्तर zsh के लिए विशिष्ट नहीं है। Zsh यहाँ कुछ भी प्रमुख नहीं लाता है। आप उद्धृत करने से थोड़ा बचा सकते हैं क्योंकि कमांड प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों की कोई आवश्यकता नहीं है, और कभी-कभी बाहरी कमांड के बजाय बिल्ट-इन का उपयोग करने के तरीके होते हैं जो कि उद्धरण आवश्यकताओं को कम करते हैं, लेकिन अंतर्निहित मुद्दे अन्य गोले के समान ही हैं।

ओह, और वैसे, ध्यान दें कि watchआपके आदेश को निष्पादित करेगा sh, न कि zsh में। यदि आप zsh में कमांड निष्पादित करना चाहते हैं, तो आपको चलाने की आवश्यकता है

watch -n 3 -x zsh -c "$cmd"

डेबियन / उबंटू पर, और

export cmd
watch -n 3 'exec zsh -c "$cmd"'

(और भी अधिक उद्धृत!) कहीं और।


धन्यवाद @ गिल्स। यह बहुत मददगार था। दिलचस्प बात यह है watchके साथ नहीं आता -xहै और न ही -cमेरी मशीन पर विकल्प। मैंने इसे ऑनलाइन देखा और किसी भी ऐसे पुरुष पृष्ठ नहीं पाए जो उनका उल्लेख करते हों। ये विकल्प क्या करते हैं?
एमिलियो वाज़क्वेज़-रीना

1
@intrpc एक शेल के माध्यम से कमांड को पास नहीं करने के लिए -xकहता है watch। मुझे अभी पता चला है कि यह डेबियन / उबंटू के लिए विशिष्ट है, भले ही इसे ऐसे संकेत नहीं दिए गए हों। -cको पारित कर दिया है zsh, नहीं करने के लिए watch
गिल्स एसओ- बुराई पर रोक '22

@ गिल्स -xऔर -execविकल्प दोनों मेरे watch( जेंटू पर) मौजूद हैं, इसलिए यह निश्चित रूप से डेबियन-विशिष्ट नहीं है। हो सकता है कि आपने किसी अन्य संस्करण के साथ तुलना की हो watch? खदान पैकेट पैकेज से आता है ।
rozcietrzewiacz

1
@rozcietrzewiacz डेबियन से भी watchआता procpsहै। आधिकारिक स्रोत नहीं है --exec। डेबियन में पैकेज (और उबंटू सहित डेरिवेटिव) एक डेबियन-विशिष्ट पैच में विकल्प जोड़ता है ( watch_exec_beep.patch, यह "मोर्टिस वॉच निष्पादन पैच" बग # 410967 से है )। Gentoo ने एक समान पैच को अपनाया हो सकता है।
गिल्स एसओ- बुराई को रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.