এই দুটি কমান্ড থেকে আউটপুট একত্রিত করা সম্ভব?
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
উভয়ের মধ্যে প্রধান পার্থক্য হ'ল প্রথমটি একটি শিশু প্রক্রিয়াটির বিভাজন হয়, এবং দ্বিতীয়টি মূল শেলটির প্রসঙ্গে কাজ করে। ভেরিয়েবল এবং অন্যান্য পরিবেশ সেটিংসের সেটিং এবং ব্যবহার সম্পর্কিত পারফরম্যান্সের সাথে এর পরিণতি হতে পারে।
ভুলে যাবেন না যে কমান্ড গ্রুপিংয়ের (এবং ফাংশনগুলি) বন্ধ করার বন্ধনীটি অবশ্যই একটি সেমিকোলন বা একটি নতুন লাইন দ্বারা বিষয়বস্তু থেকে পৃথক করা উচিত। এটি হ'ল "}"
প্রকৃতপক্ষে নিজস্ব কমান্ড (কীওয়ার্ড), এবং অবশ্যই এটির মতো আচরণ করা উচিত।
( )
কাজ থেকেও পুনঃনির্দেশ সূক্ষ্ম।
}
মোটেই আদেশ নয় isn't এটি একটি সংরক্ষিত শব্দ। একই জন্য যায় {
। আমি সাধারণত তাই মতো তালিকা লিখুন: { command1;command2;} > outfile.txt
। আপনি সেমিকোলনের পরে স্পেস যুক্ত করতে পারেন তবে এটি প্রয়োজনীয় নয়। স্থান পর {
হয় প্রয়োজন হয় তাহলে, যদিও।
( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
যার সাহায্যে লাইনগুলি ভাঙা না থাকলে আদর্শভাবে কোনও কিছু মুদ্রণ করা যায় না। (এইচএনটি টু @ আনতাক)
( command1 && command2 && command3 ) | cat
()
হিসাবে বৃত্তাকার বন্ধনী হিসাবে পছন্দ করি {}
এটি একটি পটভূমি অগ্রগতি হিসাবে চালিত হয় এবং তারপরে আপনাকে সেখান থেকে আউটপুট নিয়ে কাজ করতে হবে। এছাড়াও পাইপ থেকে বিড়াল `| ক্যাট` হ'ল তারপরে একটি দুর্দান্ত বিকল্প `> / দেব / স্টডআউট`
আমি এটি শেষ করেছিলাম, অন্যান্য পরামর্শগুলি কার্যকর হয়নি, কারণ 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
}
tail -f *.log
যদিও আমি কখনও একই লগ ফাইলটিতে 2 টি পৃথক প্রক্রিয়া লেখার সমস্যা হিসাবে দেখিনি।
yes {1..20}
কমান্ড 2 = দিয়ে এটি চেষ্টা করতে পারেন yes {1..20}
এবং সম্মিলিত আউটপুটটি পাইপ করুন | grep -v '^1 2 3'
যার মাধ্যমে লাইনগুলি না ভাঙলে আদর্শভাবে কোনও কিছুই মুদ্রণ করা যাবে না। (এইচএনটি টু @ আনতাক)
এটা চেষ্টা কর:
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
এস 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
জিএনইউ সমান্তরালের নতুন সংস্করণগুলি এমনকি আপনার ডিস্কটি পূরণ করা এড়িয়ে যায়: উপরের চিরকালের জন্য চলতে পারে।
একাধিক 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 সংযুক্ত করার জন্য, অন্যান্য উত্তর দেখুন))