एक ही कमांड को एक अलग पैरामीटर के साथ फिर से रन करें


13

मुझे पता है कि मैं निम्नलिखित कमांड चला सकता हूं

ls Some{File,Folder}

और यह इसे चलाने के बराबर है:

ls SomeFile SomeFolder

(मैं भी चीजों के लिए इसका बहुत उपयोग करता हूं mv place_{a,b})

हालाँकि, मैं सोच रहा था कि क्या कोई अलग शॉर्टकट था जहाँ मैं ऐसा कुछ कर सकता था:

run-command --a --whole --lot --of --flags parameter a; \
     run-command --a --whole --lot --of --flags parameter b

और मुझे केवल टाइप करना था run-command --a --whole --lot --of --flags parameter {a,b}या कुछ इसी तरह का।


यह निर्भर करता है run-command, कई यूनिक्स कमांड क्रम में कई फ़ाइल तर्कों को संभालते हैं।
वॉनब्रांड

जवाबों:


13

यह मानते हुए कि आप GNU bashया कुछ समान का उपयोग कर रहे हैं :

शायद एक forलूप?

for x in a b
do
    run-command --a --whole --lot --of --flags parameter $x
done

जिसे एक पंक्ति में भी लिखा जा सकता है for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done


1
या यदि आपके पास बहुत कुछ है जिसे आप चलाना चाहते हैं तो आप बैश विस्तार का उपयोग कर सकते हैंfor x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller

वहाँ जाता है एक अंतरिक्ष अलग सूची कई मायनों में उत्पन्न हो सकता है। तो, हाँ, {a..z}, *.pdf, $(find ...)...
njsg

मैं नहीं जानता कि मेरा दिमाग लूप में क्यों नहीं कूदता। धन्यवाद! यह शायद वही होगा जो मैं उपयोग करता हूं। फंक्शन आइडिया अच्छा है, लेकिन मुझे यह बेहतर लगता है।
ashays

1
;निम्नलिखित doकीवर्ड को हटाने के बाद केवल एक-लाइनर ने मेरे लिए काम किया ।
जिम्प

@jimp धन्यवाद, मैंने उसे हटाने के लिए कोड बदल दिया है ;
nssg

5

यदि आप इसे स्क्रिप्ट नहीं कर रहे हैं और बस इसे कमांड लाइन पर आसानी से चलाना चाहते हैं, तो xargsकमांड संभवतः वह है जो आप खोज रहे हैं।

xargs मानक इनपुट से सामग्री का एक गुच्छा लेगा, और इसे कमांड के लिए तर्क के रूप में उपयोग करें, यदि आवश्यक हो तो कई बार उस कमांड को चलाए।

निम्नलिखित का प्रयास करें:

echo parameter a,parameter b | xargs -n 1 -d , run-command --a --whole --lot --of --flags

इस उदाहरण में, आप बस xargs को क्रमपरिवर्तन दे रहे हैं जिसे आप इसे चलाना चाहते हैं।

"-N 1" ध्वज xargs को प्रति तर्क के सिर्फ 1 उपयोग करने के लिए बताने के लिए।

"-D," ध्वज इनपुट को चलाने के लिए तर्कों के बीच अपराधी के रूप में इनपुट पर "," देखने के लिए शब्द कहता है। (ध्यान दें कि यदि तर्क में "," है तो आपको इसे किसी और चीज़ में बदलना होगा। यदि आपके तर्कों में कोई जगह नहीं है तो आप इस ध्वज को पूरी तरह से छोड़ सकते हैं।)

man xargsअधिक जानकारी के लिए देखें ।


4

आप एक फ़ंक्शन का उपयोग भी कर सकते हैं, जो आपको अपने बदलते तर्क को अंत में सीमित नहीं करता है:

runcom() { run-command --a --whole --lot --of --flags parameter "$1" ; }

runcom a
runcom b

2

आप पिछले आदेश में प्रतिस्थापन कर सकते हैं। यह आपके {a, b} उदाहरण के साथ काम नहीं करेगा, क्योंकि 'a' के सभी उदाहरणों को 'b' से बदल दिया जाएगा। लेकिन कल्पना करें कि आप निम्नलिखित कमांड को निष्पादित करना चाहते हैं:

run-command --a --whole --lot --of --parameter --format xml
run-command --a --whole --lot --of --parameter --format son

आप इसके साथ कर सकते हैं

run-command --a --whole --lot --of --parameter --format xml
!!:s/xml/json/

बैश सबस्टेशन करेंगे और चलाएंगे

run-command --a --whole --lot --of --parameter --format json

केवल एक ही नहीं, कई प्रतिस्थापन करने के लिए gs (वैश्विक प्रतिस्थापन) का उपयोग करें।


1

नहीं है aliasबैश में आदेश:

$ alias shotcommand='run-command --a --whole --lot --of --flags parameter'

उपयोग है: $ shotcommand a


वहाँ भी कार्य कर रहे हैं, अगर कोड थोड़ा अधिक जटिल है :-)
njsg

2
यह समाधान केवल तभी काम करता है जब मेरा बदलता पैरामीटर अंतिम एक हो, सही हो?
ashays

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