बश में दो कमांड से आउटपुट को मिलाएं


81

क्या इन दो कमांड से आउटपुट को संयोजित करना संभव है?

node ~/projects/trunk/index.js 
python ~/projects/trunk/run.py run

न तो आदेश बाहर निकलता है इसलिए मुझे यकीन नहीं है कि यह कैसे करना है।


3
यदि कार्यक्रम समाप्त नहीं होते हैं, तो संभवतः वे लगातार आउटपुट लिखते हैं? यो अपने आउटपुट के साथ क्या करना चाहते हैं? इंटरलीव लाइन्स, ...? तुम ऐसा क्यों करना चाहते हो?
वॉनब्रांड

2
नोड कमांड ज्यादा आउटपुट नहीं करता है, लेकिन फिर भी इसे चलाने की आवश्यकता है। अजगर एक सभी अनुरोधों का उत्पादन करता है, मैं दोनों को पकड़ना चाहता हूं और उन दोनों को एक ही शेल विंडो में देखना चाहता हूं।
चोवि

जवाबों:


108

आप इसके साथ समूहीकरण करके दो कमांड जोड़ सकते हैं { }:

{ command1 & command2; }

अब तक, आप समूह को एक फ़ाइल में पुनर्निर्देशित कर सकते हैं (अंतिम ;से पहले }अनिवार्य है):

{ command1 & command2; } > new_file

यदि आप अलग करना चाहते हैं STDOUTऔर STDERRदो फाइलों में:

{ command1 & command2; } > STDOUT_file 2> STDERR_file

3
कोई बात नहीं है कि वे कार्यक्रम खत्म नहीं करते हैं। 'टेल-ऑफ' या तो "खत्म" नहीं करता है, लेकिन यह अभी भी काम करता है और दोनों कार्यक्रमों के आउटपुट को जोड़ती है। दो से अधिक आदेशों के लिए भी काम करता है। ^ समूह की आज्ञाओं में से केवल एक को छोड़ने के लिए सी। आपको दूसरे के हाथ को मारना होगा, हालाँकि।
सुपरमैजिक

5
लगता है जैसे आपके पास ;पहले की कमी है }, यह अनिवार्य है!
गिल्स केनॉट

2
सावधान रहें: यह पूरी लाइनों को संरक्षित नहीं करता है! लाइनों के एक-दूसरे से अलग हो जाने और आपस में मिल जाने के कारण आपको अविश्वसनीय आउटपुट मिलेंगे। आप यह कोशिश कर सकते हैं { yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'जिसके साथ यदि रेखाएं टूटी हुई नहीं हैं तो आदर्श रूप से कुछ भी प्रिंट नहीं करेगा
एंटैक १17 ’१17 १:११

8
मैं नहीं बल्कि प्रयोग करेंगे &&बजाय &! command1 & command2- यह बैकग्राउंड में कमांड 1 चलाता है और कमांड 2 को तुरंत शुरू करता है, इस प्रकार दोनों कमांड को समानांतर में चलाता है और आउटपुट को मैसेज करता है। command1 && command2- यह कमांड 1 (अग्रभूमि में) चलाता है और फिर, यदि कमांड 1 ने सुसाइड किया है, तो कमांड 2 चलाता है।
डेजुन

1
@ डडज़ुन ओपी ने कहा कि न तो कमान बाहर निकलती है, इसलिए आपके समाधान के साथ, दूसरी कमान कभी नहीं चलेगी
ज़ोए हेवेल

50

आम तौर पर, एक उप-समूह या कमांड ग्रुपिंग का उपयोग करना संभव है, और एक ही बार में पूरे समूह के आउटपुट को पुनर्निर्देशित करना।

कोड:

( command1 ; command2 ; command3 ) | cat

{ command1 ; command2 ; command3 ; } > outfile.txt

दोनों के बीच मुख्य अंतर यह है कि पहला बच्चा प्रक्रिया का विभाजन करता है, जबकि दूसरा मुख्य शेल के संदर्भ में संचालित होता है। यह चर और अन्य पर्यावरण सेटिंग्स की सेटिंग और उपयोग, साथ ही प्रदर्शन के बारे में परिणाम हो सकता है।

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


2
( )कार्यों से पुनर्निर्देशन भी ठीक है।
मुरु

2
}एक कमांड बिल्कुल नहीं है। यह एक आरक्षित शब्द है। उसी के लिए जाता है {। मैं आमतौर पर इतनी तरह ऐसी सूची लिखें: { command1;command2;} > outfile.txt। आप अर्धविराम के बाद रिक्त स्थान जोड़ सकते हैं लेकिन यह आवश्यक नहीं है। हालांकि इसके बाद { का स्थान आवश्यक है।
वाइल्डकार्ड

1
सावधान रहें: यह पूरी लाइनों को संरक्षित नहीं करता है! लाइनों के एक-दूसरे से अलग हो जाने और आपस में मिल जाने के कारण आपको अविश्वसनीय आउटपुट मिलेंगे। आप यह कोशिश कर सकते हैं ( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'जिसके साथ यदि रेखाएं टूटी हुई नहीं हैं तो आदर्श रूप से कुछ भी प्रिंट नहीं करेगा (H / t से @antak)।
ओले तांगे

3
कभी-कभी आप कमांड 2 को केवल तभी चलाना चाहते हैं यदि ( command1 && command2 && command3 ) | cat
कमांड

मैं राउंड ब्रैकेट पसंद करता हूं ()क्योंकि घुंघराले कोष्ठक के साथ {}यह एक पृष्ठभूमि प्रगति के रूप में चलता है और फिर आपको उसी से आउटपुट से निपटना होगा। इसके अलावा बिल्ली के लिए पाइप `| cat` एक अच्छा विकल्प है, फिर `> / देव / stdout`
DarkMukke

2

मैंने ऐसा करना समाप्त कर दिया, अन्य सुझाव काम नहीं आए, क्योंकि दूसरा आदेश या तो मारा गया या कभी निष्पादित नहीं हुआ।

alias app () {
    nohup python ~/projects/trunk/run.py run 1>/tmp/log 2>&1 &
    echo $! > /tmp/api.pid
    nohup node ~/projects/trunk/index.js 1>/tmp/log 2>&1 &
    echo $! > /tmp/client.pid
    tail -f /tmp/log
}

1
नोट: यह I / O त्रुटियों का कारण हो सकता है यदि दो प्रक्रियाएं "एक ही समय में" फ़ाइल में लिखने का प्रयास करती हैं।
15

2
2 भिन्न लॉग फ़ाइल निर्दिष्ट कर सकते हैं और tail -f *.logयद्यपि मैंने इसे 2 लॉग के लिए अलग-अलग प्रक्रियाओं के साथ समस्या के रूप में कभी नहीं देखा है।
chovy

@chovy: क्या आप अपना मुद्दा यहां प्रश्न के रूप में लिख सकते हैं ... यह उपयोगी है
अब्देनॉर टुमी

1
सावधान रहें: यह पूरी लाइनों को संरक्षित नहीं करता है! लाइनों के एक-दूसरे से अलग हो जाने और आपस में मिल जाने के कारण आपको अविश्वसनीय आउटपुट मिलेंगे। आप yes {1..20}कमांड 1 = कमांड 2 = के साथ यह कोशिश कर सकते हैं yes {1..20}और संयुक्त आउटपुट को पाइप कर सकते हैं | grep -v '^1 2 3'जिसके माध्यम से आदर्श रूप से कुछ भी प्रिंट नहीं होगा यदि लाइनें टूटी नहीं हैं। (H / t से @antak)।
ओले तांगे

यदि डेटा की मात्रा बड़ी है तो उसके ऊपर आपकी डिस्क पूरी चल सकती है।
ओले तांगे

2

इसे इस्तेमाल करे:

paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile

1
'पेस्ट ’क्या करता है?
चोवे

@chovy, यहाँ देखें: techrepublic.com/article/… यकीन नहीं है कि क्या यह इस संदर्भ में काम करेगा।
फिक्समेकर

मुझे नहीं लगता कि पेस्ट यहां उपयुक्त है, क्योंकि यह प्रत्येक अभिभावक के बगल में कॉलम लगाने के लिए है
बर्नहार्ड

@ बर्नहार्ड वास्तव में। लेकिन यह
3

@ frogstarr78 मुझे लगता है कि यह बहुत संभावना नहीं है कि यह वही है जो वह चाहता है, लेकिन आप सही हैं, यह निर्दिष्ट नहीं है।
बर्नहार्ड

1

अब तक के अधिकांश समाधान आंशिक रेखा समस्या से बुरी तरह से निपटते हैं। एक दूसरे के लिए मान लें कि कार्यक्रम हैं:

cmd1() {
    perl -e 'while(1) { print "a"x3000_000,"\n"}'
}
export -f cmd1
cmd2() {
    perl -e 'while(1) { print "b"x3000_000,"\n"}'
}
export -f cmd2

जब आप समानांतर में चल रहे हैं, तो आप चाहते हैं कि आउटपुट में पूरी रेखाएं हों और aउसके बाद पूरी रेखाएं हों b। आप जो नहीं चाहते हैं, वह एक ही लाइन पर as और bs मिक्सिंग है ( tr -s abरिपीट as को सिंगल के साथ रिप्लेस aकरता है, इसलिए यह देखना आसान है कि क्या है):

# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab

यदि आप इसके बजाय GNU पैरेलल का उपयोग करते हैं, तो आपको as या bs के साथ अच्छी साफ़ पूर्ण लाइनें मिलती हैं, लेकिन कभी मिश्रित नहीं होती हैं:

$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a

जीएनयू समानांतर के नए संस्करण भी आपकी डिस्क को भरने से बचते हैं: उपरोक्त हमेशा के लिए चल सकता है।


0

चूंकि आप पहले से ही उपयोग कर रहे हैं node, इसलिए आप समवर्ती प्रयास करना चाह सकते हैं

समवर्ती कई कमांड चलाएं। जैसा npm run watch-js & npm run watch-lessलेकिन बेहतर।


0

एक पंक्ति में कई BASH कमांड आउटपुट के संयोजन के विशेष मामले के लिए, यहाँ प्रत्येक कमांड को बदले में चलाने के लिए एक नुस्खा है, जो अपने आउटपुट के बीच किसी भी नईलाइन को हटाता है।

(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef

एक वास्तविक दुनिया उदाहरण के रूप में, नीचे दिए गए कोड बाइट्स के दो निश्चित तारों के बीच एक ASCII संदेश एम्बेड करेंगे (इस मामले में, एक प्रिंट कमांड का गठन)

#   hex prefix           encode a message as hex    hex suffix    | strip newline | hex to binary | (then, for example, send the binary over a TCP connection)
(echo '1b40' && echo "Test print #1" | xxd -p && echo '1d564103') | tr -d '\n'    | xxd -r -p     | nc -N 192.168.192.168 9100

(नोट: यह विधि केवल तभी काम करती है जब कमांड बाहर निकलती हैं। कमांड से स्टैडआउट के संयोजन के लिए जो बाहर नहीं निकलती हैं, अन्य उत्तर देखें।)


(1) कृपया अपने दूसरे कमांड का आउटपुट (अपेक्षित) दिखाएं। (२) कृपया बताएं कि ओपी इस तकनीक का उपयोग अपनी समस्या को हल करने के लिए कैसे करेगा।
स्कॉट

1) दूसरी कमांड का आउटपुट नॉन-अस्की बाइनरी है, इसलिए इसे दिखाना उपयोगी नहीं होगा। 2) ओपी संभावना ने 2013 और अब के बीच अपनी विशिष्ट समस्या को हल किया। यह प्रश्न अब प्रभावी रूप से कई बैश कमांडों के संयोजन के संदर्भ में है, इसलिए मेरा मानना ​​है कि उन्हें एक पंक्ति में संयोजित करने के लिए एक तकनीक एक उपयोगी "नुस्खा" है जिसका उल्लेख यहां किया गया है (क्योंकि मैं यहां आया था और ढूंढ नहीं पाया। यह)।
ल्यूक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.