क्या इन दो कमांड से आउटपुट को संयोजित करना संभव है?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
न तो आदेश बाहर निकलता है इसलिए मुझे यकीन नहीं है कि यह कैसे करना है।
क्या इन दो कमांड से आउटपुट को संयोजित करना संभव है?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
न तो आदेश बाहर निकलता है इसलिए मुझे यकीन नहीं है कि यह कैसे करना है।
जवाबों:
आप इसके साथ समूहीकरण करके दो कमांड जोड़ सकते हैं { }
:
{ command1 & command2; }
अब तक, आप समूह को एक फ़ाइल में पुनर्निर्देशित कर सकते हैं (अंतिम ;
से पहले }
अनिवार्य है):
{ command1 & command2; } > new_file
यदि आप अलग करना चाहते हैं STDOUT
और STDERR
दो फाइलों में:
{ command1 & command2; } > STDOUT_file 2> STDERR_file
;
पहले की कमी है }
, यह अनिवार्य है!
{ yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'
जिसके साथ यदि रेखाएं टूटी हुई नहीं हैं तो आदर्श रूप से कुछ भी प्रिंट नहीं करेगा
&&
बजाय &
! command1 & command2
- यह बैकग्राउंड में कमांड 1 चलाता है और कमांड 2 को तुरंत शुरू करता है, इस प्रकार दोनों कमांड को समानांतर में चलाता है और आउटपुट को मैसेज करता है। command1 && command2
- यह कमांड 1 (अग्रभूमि में) चलाता है और फिर, यदि कमांड 1 ने सुसाइड किया है, तो कमांड 2 चलाता है।
आम तौर पर, एक उप-समूह या कमांड ग्रुपिंग का उपयोग करना संभव है, और एक ही बार में पूरे समूह के आउटपुट को पुनर्निर्देशित करना।
कोड:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
दोनों के बीच मुख्य अंतर यह है कि पहला बच्चा प्रक्रिया का विभाजन करता है, जबकि दूसरा मुख्य शेल के संदर्भ में संचालित होता है। यह चर और अन्य पर्यावरण सेटिंग्स की सेटिंग और उपयोग, साथ ही प्रदर्शन के बारे में परिणाम हो सकता है।
यह न भूलें कि कमांड ग्रुपिंग (और फ़ंक्शंस) में क्लोजिंग ब्रैकेट को अर्धविराम या न्यूलाइन द्वारा कंटेंट से अलग किया जाना चाहिए। ऐसा इसलिए है क्योंकि "}"
वास्तव में इसका एक कमांड (कीवर्ड) है, और इसे एक जैसा माना जाना चाहिए।
( )
कार्यों से पुनर्निर्देशन भी ठीक है।
}
एक कमांड बिल्कुल नहीं है। यह एक आरक्षित शब्द है। उसी के लिए जाता है {
। मैं आमतौर पर इतनी तरह ऐसी सूची लिखें: { command1;command2;} > outfile.txt
। आप अर्धविराम के बाद रिक्त स्थान जोड़ सकते हैं लेकिन यह आवश्यक नहीं है। हालांकि इसके बाद {
का स्थान आवश्यक है।
( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
जिसके साथ यदि रेखाएं टूटी हुई नहीं हैं तो आदर्श रूप से कुछ भी प्रिंट नहीं करेगा (H / t से @antak)।
( command1 && command2 && command3 ) | cat
()
क्योंकि घुंघराले कोष्ठक के साथ {}
यह एक पृष्ठभूमि प्रगति के रूप में चलता है और फिर आपको उसी से आउटपुट से निपटना होगा। इसके अलावा बिल्ली के लिए पाइप `| cat` एक अच्छा विकल्प है, फिर `> / देव / stdout`
मैंने ऐसा करना समाप्त कर दिया, अन्य सुझाव काम नहीं आए, क्योंकि दूसरा आदेश या तो मारा गया या कभी निष्पादित नहीं हुआ।
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
}
tail -f *.log
यद्यपि मैंने इसे 2 लॉग के लिए अलग-अलग प्रक्रियाओं के साथ समस्या के रूप में कभी नहीं देखा है।
yes {1..20}
कमांड 1 = कमांड 2 = के साथ यह कोशिश कर सकते हैं yes {1..20}
और संयुक्त आउटपुट को पाइप कर सकते हैं | grep -v '^1 2 3'
जिसके माध्यम से आदर्श रूप से कुछ भी प्रिंट नहीं होगा यदि लाइनें टूटी नहीं हैं। (H / t से @antak)।
इसे इस्तेमाल करे:
paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
अब तक के अधिकांश समाधान आंशिक रेखा समस्या से बुरी तरह से निपटते हैं। एक दूसरे के लिए मान लें कि कार्यक्रम हैं:
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
। आप जो नहीं चाहते हैं, वह एक ही लाइन पर a
s और b
s मिक्सिंग है ( tr -s ab
रिपीट a
s को सिंगल के साथ रिप्लेस a
करता है, इसलिए यह देखना आसान है कि क्या है):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
यदि आप इसके बजाय GNU पैरेलल का उपयोग करते हैं, तो आपको a
s या b
s के साथ अच्छी साफ़ पूर्ण लाइनें मिलती हैं, लेकिन कभी मिश्रित नहीं होती हैं:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
जीएनयू समानांतर के नए संस्करण भी आपकी डिस्क को भरने से बचते हैं: उपरोक्त हमेशा के लिए चल सकता है।
एक पंक्ति में कई 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
(नोट: यह विधि केवल तभी काम करती है जब कमांड बाहर निकलती हैं। कमांड से स्टैडआउट के संयोजन के लिए जो बाहर नहीं निकलती हैं, अन्य उत्तर देखें।)