Bashでの2つのコマンドの出力のマージ

Bashでの2つのコマンドの出力のマージ

これら2つのコマンドの出力をマージできますか?

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

どちらのコマンドも終了しないので、これを行う方法がわかりません。

答え1

2つのコマンドをグループ化して組み合わせることができます{ }

{ command1 & command2; }

これまではグループをファイル(最後のもの;の前には}必須)、開くかっこと閉じ括弧の間のスペースも同じです。

{ command1 & command2; } > new_file

STDOUT合計をSTDERR2つのファイルに分割する場合:

{ command1 & command2; } > STDOUT_file 2> STDERR_file

バックグラウンドで最初のコマンドを実行したくない場合は、次の形式を使用します。

{ command1; command2; }

または

{ command1 && command2; }

最初のコマンドが成功した場合にのみ2番目のコマンドを実行します。

答え2

より一般的には、サブシェルまたはコマンドグループを使用し、グループ全体の出力を一度にリダイレクトできます。

パスワード:

( command1 ; command2 ; command3 ) | cat

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

2つの主な違いは、最初のプロセスが子プロセスに分割され、2番目のプロセスがプライマリシェルのコンテキストで実行されることです。これは、変数の設定と使用、およびその他の環境設定とパフォーマンスに影響を与える可能性があります。

コマンドグループ(および関数)の閉じ括弧は、セミコロンまたは改行で内容と区別する必要があることを忘れないでください。"}"実際にはコマンド(キーワード)なので、コマンドのように扱わなければならないからです。

答え3

今日まで、ほとんどの解決策はいくつかの配線問題を正しく解決しませんでした。これらのプログラムは次のように仮定します。

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並列実行時には、出力にsのフルラインとsのフルラインが表示されるようにしますb。あなたは何をいいえasとbsを同じ行に混在させたい(tr -s ab繰り返しのsを単一のsに置き換えると、何が起こるのかをより簡単に見ることができます):aa

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

GNU Parallelを使用すると、asまたはsを使用してbきれいできれいなライン全体を得ることができますが、混合はありません。

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

最新バージョンのGNU Parallelは、ディスクの充填を防止します。上記のコードは永久に実行されます。

答え4

cat許可された回答の出力が正しい順序で表示されないことがあります。ソースが非同期の場合(たとえば、またはcurl)、使用しないでください。

代わりにこれを使用してください:

cat <(command1) <(command2) <(command3) > output.txt

実際のケース:

cat \
<(curl https://stackoverflow.com/humans.txt) \
<(echo -e "\n\nDownloaded from https://stackoverflow.com") \
> output.md

生産

There's a bunch of humans behind Stack Overflow and the network of Stack Exchange sites. If you'd like to join us check out https://stackoverflow.com/company/work-here

Downloaded from https://stackoverflow.com

関連情報