web-dev-qa-db-ja.com

2つのバックグラウンドシェル関数の出力を順番に印刷したい

バックグラウンドで実行するシェルスクリプトには2つの機能があります。

function foo {
  # do a bunch of things
  # print a lot of output
}

function bar {
  # do more things
  # print out more things
}

foo &
bar &
wait

出力は、stdoutまたはstderrに出力されるときに出力されるため、多くの重複があります。

[foo] output line 1
[bar] output line 1 
[foo] output line 2
[bar] output line 2

読みやすくするために、出力を順番に印刷する(すべてのfooの出力の後にbarのすべての出力が続く)ようにしたい。出力をファイルに書き込んでからファイルを印刷する必要がありますか、またはファイルに書き込まずにこれを行う方法はありますか?

1
D Day

とにかくすべての出力はファイルに書き込まれますが、ファイルを使用する方法notはわかりません。必要に応じて一時ファイルを使用します。例:

$ a=$(mktemp)
$ b=$(mktemp)
$ echo 1 >$a & echo 2 >$b & wait
$ cat $b
2
$ cat $a
1

mktempは2つの一時ファイルabを作成します。echoコマンドは一時ファイルに書き込みます。その後、catを使用して、必要なときにいつでも印刷できます。出力。 stdoutとstderrの両方をリダイレクトする場合は、代わりに&>を使用します。

4
dessert

さて、システムはこれを達成するためにとにかくファイルに書き込んでいます。それらは単なる一時ファイルです。ただし、fooプロセスを1つのファイルに出力し、完了したら名前を変更することもできます。 barに上記のファイルの名前変更を監視させ、fooが名前変更を完了すると、barはfoo出力を出力し、独自の出力laを出力します。

function foo {  
  # do a bunch of things  
  # print a lot of output to /tmp/foo.work  
  # mv /tmp/foo.work /tmp/foo.done  
}  

function bar {   
  # do more things  
  # write more things to /tmp/bar.done  
  # if exist /tmp/foo.done print /tmp/foo.done else wait 1 and recheck  
  # rm /tmp/foo.done  
  # print /tmp/bar.done  
}  
0
K7AAY