एक लाइन में कई कमांड्स के लिए एक तर्क पास करना


10

मैं एक ही लाइन में एक ही फाइल पर कई कमांड चलाने में सक्षम होना चाहता हूं। जिस तरह से मैं वर्तमान में यह कर रहा हूँ:

commandA file && commandB file && perl -ne '...' file

मेरी आंत वृत्ति मुझे बताती है कि केवल एक बार फाइलनाम तर्क प्रदान करने का तरीका होना चाहिए और इसे दोनों कमांडों को एक साथ xargsया कुछ इसी तरह से पाइप करना चाहिए:

find file | xargs commandA && xargs commandB && xargs perl -ne '...'

जब मैं यह कोशिश करता हूं, तो केवल पहली कमांड चलती है। मैं जो करना चाहता हूं उसे कैसे हासिल कर सकता हूं?

जवाबों:


12

आप इसके लिए एक स्थानीय चर को परिभाषित कर सकते हैं:

f=file; commandA $f && commandB $f && ...

आप सभी बिना शर्त ( &&साथ प्रतिस्थापित ;) या समानांतर ( &&साथ प्रतिस्थापित) को भी निष्पादित कर सकते हैं &

वैकल्पिक रूप से, आप पिछले तर्कों के संदर्भ में शेल इतिहास विस्तार का भी उपयोग कर सकते हैं:

commandA file && commandB !:1 && ...

बिल्कुल नहीं जो मेरे मन में था, लेकिन एक दिलचस्प विकल्प है।
ज़ेड

इस उत्तर में क्या गलत है?
क्रिस

यह वास्ताव में अच्छा है! क्या एक नया चर परिभाषित करने का कोई तरीका नहीं है?
उपयोगकर्ता

@user, मैंने एक विकल्प जोड़ा है।
मैक्सक्लेपज़िग


2

आप कमांड लाइन बनाने के लिए xargs का उपयोग कर सकते हैं जैसे:

echo file | xargs -i -- echo ls -l {}\; wc -l {}

बस इसे चलाने के लिए बैश में ऊपर पाइप करें:

echo file | xargs -i -- echo ls -l {}\; wc -l {} | bash

मौजूदा निर्देशिका में * ग फ़ाइलें सभी के लिए उदाहरण का विस्तार (भागने ls किसी भी खोल उर्फ प्रतिस्थापन को रोकने के लिए यहाँ):

\ls -1 *.c | xargs -i -- echo ls -l {}\; wc -l {} | bash

इसका उपयोग निर्देशिकाओं में निहित सभी फाइलों की सूची प्राप्त करने के लिए किया जाता है, जहां नाम "एनम" जैसा है: find . -name "*enums*" | xargs -i echo -e echo {}\; ls -lh {}\; echo -e '\n\n' | bash
मैट लैचमैन

1

मैं इसके लिए खुद को वोट नहीं दूंगा। यह मूर्खतापूर्ण और खतरनाक है, लेकिन ऐसा करने के तरीकों को सूचीबद्ध करने के हित में है:

for cmd in "commandA" "commandB" "perl -ne '...'" ; do eval $cmd file ; done

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