bash এ দুটি কমান্ড থেকে আউটপুট একত্রিত করুন


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
তারা প্রোগ্রামগুলি শেষ করে না তাতে কিছু যায় আসে না। 'টেল-ফ' কোনওটি "সমাপ্ত" করে না, তবে এটি এখনও উভয় প্রোগ্রামের আউটপুটগুলিতে কাজ করে এবং একত্রিত করে। পাশাপাশি আরও দুটি কমান্ডের জন্য কাজ করে। quit সি ছাড়ার জন্য গ্রুপবদ্ধ কমান্ডগুলির মধ্যে কেবল একটিই হত্যা করে। যদিও আপনাকে অন্যটিকে নিজেই মেরে ফেলতে হবে।
সুপারম্যাগিক

5
মনে হচ্ছে আপনার ;আগে শেষের অভাব নেই }, এটি বাধ্যতামূলক!
গিলস কোনেট

2
সতর্কতা অবলম্বন করুন: এটি পুরো লাইনগুলি সংরক্ষণ করে না! অবিশ্বাস্য আউটপুটগুলি পাবেন কারণ লাইনগুলি আংশিক উপায়ে বিভক্ত হয়ে যায় এবং একে অপরের মধ্যে মিশে যায়। আপনি এটি চেষ্টা করতে পারেন { yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'যার সাহায্যে লাইনগুলি ভাঙা না থাকলে আদর্শভাবে কোনও কিছু মুদ্রণ করা যায় না।
আনতক

8
আমি বরং পরিবর্তে ব্যবহার করতে &&হবে &! command1 & command2- এটি ব্যাকগ্রাউন্ডে কমান্ড 1 চালায় এবং তত্ক্ষণাত কমান্ড 2 শুরু করে, এভাবে সমান্তরালে উভয় কমান্ড চালানো হয় এবং আউটপুট মেসে যায়। command1 && command2- এটি কমান্ড 1 চালায় (অগ্রভাগে) এবং তারপরে, যদি কমান্ড 1 সফল হয়, কমান্ড 2 চালায়।
DUzun

1
@ ডিউজুন ওপি বলেছেন যে কমান্ডের বাইরে নেই, সুতরাং আপনার সমাধানের সাথে দ্বিতীয় কমান্ড কখনই চলবে না
জোয়ে হিউল

50

আরও সাধারণভাবে, একটি সাব-শেল বা কমান্ড গ্রুপিং ব্যবহার করা এবং একবারে পুরো গোষ্ঠীর আউটপুট পুনর্নির্দেশ করা সম্ভব।

কোড:

( command1 ; command2 ; command3 ) | cat

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

উভয়ের মধ্যে প্রধান পার্থক্য হ'ল প্রথমটি একটি শিশু প্রক্রিয়াটির বিভাজন হয়, এবং দ্বিতীয়টি মূল শেলটির প্রসঙ্গে কাজ করে। ভেরিয়েবল এবং অন্যান্য পরিবেশ সেটিংসের সেটিং এবং ব্যবহার সম্পর্কিত পারফরম্যান্সের সাথে এর পরিণতি হতে পারে।

ভুলে যাবেন না যে কমান্ড গ্রুপিংয়ের (এবং ফাংশনগুলি) বন্ধ করার বন্ধনীটি অবশ্যই একটি সেমিকোলন বা একটি নতুন লাইন দ্বারা বিষয়বস্তু থেকে পৃথক করা উচিত। এটি হ'ল "}"প্রকৃতপক্ষে নিজস্ব কমান্ড (কীওয়ার্ড), এবং অবশ্যই এটির মতো আচরণ করা উচিত।


2
( )কাজ থেকেও পুনঃনির্দেশ সূক্ষ্ম।
মুড়ু

2
}মোটেই আদেশ নয় isn't এটি একটি সংরক্ষিত শব্দ। একই জন্য যায় {। আমি সাধারণত তাই মতো তালিকা লিখুন: { command1;command2;} > outfile.txt। আপনি সেমিকোলনের পরে স্পেস যুক্ত করতে পারেন তবে এটি প্রয়োজনীয় নয়। স্থান পর { হয় প্রয়োজন হয় তাহলে, যদিও।
ওয়াইল্ডকার্ড

1
সতর্কতা অবলম্বন করুন: এটি পুরো লাইনগুলি সংরক্ষণ করে না! অবিশ্বাস্য আউটপুটগুলি পাবেন কারণ লাইনগুলি আংশিক উপায়ে বিভক্ত হয়ে যায় এবং একে অপরের মধ্যে মিশে যায়। আপনি এটি চেষ্টা করতে পারেন ( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'যার সাহায্যে লাইনগুলি ভাঙা না থাকলে আদর্শভাবে কোনও কিছু মুদ্রণ করা যায় না। (এইচএনটি টু @ আনতাক)
ওলে টাঞ্জ

3
কখনও কখনও আপনি কেবল কমান্ড 2 চালাতে চান যদি কমান্ড 1 সফল হয়:( command1 && command2 && command3 ) | cat
ডিউজুন

আমি বৃত্তাকার বন্ধনী ()হিসাবে বৃত্তাকার বন্ধনী হিসাবে পছন্দ করি {}এটি একটি পটভূমি অগ্রগতি হিসাবে চালিত হয় এবং তারপরে আপনাকে সেখান থেকে আউটপুট নিয়ে কাজ করতে হবে। এছাড়াও পাইপ থেকে বিড়াল `| ক্যাট` হ'ল তারপরে একটি দুর্দান্ত বিকল্প `> / দেব / স্টডআউট`
ডার্কমুককে

2

আমি এটি শেষ করেছিলাম, অন্যান্য পরামর্শগুলি কার্যকর হয়নি, কারণ 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 ত্রুটির কারণ হতে পারে।
জিজিয়াস

2
2 টি পৃথক লগ ফাইল নির্দিষ্ট করতে পারে এবং করতে পারে tail -f *.logযদিও আমি কখনও একই লগ ফাইলটিতে 2 টি পৃথক প্রক্রিয়া লেখার সমস্যা হিসাবে দেখিনি।
chovy

@ শেভি: আপনি কি এখানে নিজের সমস্যাটিকে প্রশ্ন হিসাবে লিখতে পারতেন ... এটি দরকারী
আবদেনর টুমি

1
সতর্কতা অবলম্বন করুন: এটি পুরো লাইনগুলি সংরক্ষণ করে না! অবিশ্বাস্য আউটপুটগুলি পাবেন কারণ লাইনগুলি আংশিক উপায়ে বিভক্ত হয়ে যায় এবং একে অপরের মধ্যে মিশে যায়। আপনি কমান্ড 1 = yes {1..20}কমান্ড 2 = দিয়ে এটি চেষ্টা করতে পারেন yes {1..20}এবং সম্মিলিত আউটপুটটি পাইপ করুন | grep -v '^1 2 3'যার মাধ্যমে লাইনগুলি না ভাঙলে আদর্শভাবে কোনও কিছুই মুদ্রণ করা যাবে না। (এইচএনটি টু @ আনতাক)
ওলে টাঞ্জ

উপরের অংশে যদি ডেটার পরিমাণ বড় হয় তবে আপনার ডিস্কটি পুরো চলতে পারে।
ওলে টেঞ্জ

2

এটা চেষ্টা কর:

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

1
'পেস্ট' কি করে?
চবি

@ শেভি, এখানে দেখুন: techrepublic.com/article/… নিশ্চিত না যদিও এটি এই প্রসঙ্গে কাজ করবে কিনা।
ফিক্সমেকার

আমি এখানে পেস্ট উপযুক্ত বলে মনে করি না, কারণ এটি প্রতিটিের পাশে কলাম স্থাপন করা বোঝায়
বার্নহার্ড

@ বার্নহার্ড সত্যিই তবে এটি
রেকর্ডে

@ ফ্রগস্টায়ার 7878 আমি মনে করি যে তিনি যা চান এটি চূড়ান্ত নয় you তবে আপনি ঠিক বলেছেন, এটি নির্দিষ্ট করা হয়নি।
বার্নহার্ড

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গুলি। আপনি যা চান না তা হ'ল aএস bলাইনে একই মিশ্রণ ( tr -s abপুনরাবৃত্তির পরিবর্তে একটিটির aসাথে প্রতিস্থাপন করা হয় a, তাই কী ঘটে তা দেখতে সহজ):

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

আপনি যদি এর পরিবর্তে জিএনইউ সমান্তরাল ব্যবহার করেন তবে আপনি উভয় aএর সাথে সুন্দর পরিষ্কার লাইন পান bতবে কখনও মিশ্রিত হন না:

$ 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

(দ্রষ্টব্য: কমান্ডগুলি প্রস্থান করলে এই পদ্ধতিটি কেবল কাজ করে exit প্রস্থান না হওয়া কমান্ডগুলি থেকে stdout সংযুক্ত করার জন্য, অন্যান্য উত্তর দেখুন))


(1) দয়া করে আপনার দ্বিতীয় কমান্ডের (প্রত্যাশিত) আউটপুট দেখান। (২) দয়া করে দেখান যে ওপি কীভাবে তার সমস্যা সমাধানের জন্য এই কৌশলটি ব্যবহার করবে।
স্কট

1) দ্বিতীয় কমান্ডের আউটপুটটি নন-এসকিআই বাইনারি হয়, সুতরাং এটি প্রদর্শন করা কার্যকর হবে না। 2) ওপি সম্ভবত 2013 এবং এখনকার মধ্যে তার নির্দিষ্ট সমস্যা সমাধান করেছে। এই প্রশ্নটি এখন কার্যকরভাবে একাধিক বাশ কমান্ডের স্টাডআউট সংমিশ্রণ করার জন্য একটি রেফারেন্স, সুতরাং আমি বিশ্বাস করি যে তাদের এক লাইনে সংযুক্ত করার জন্য একটি কৌশল এখানে উল্লেখ করার জন্য একটি দরকারী "রেসিপি" রয়েছে (যেহেতু আমি এটির জন্য এখানে এসেছি এবং খুঁজে পাইনি) এটা)।
লুক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.