バックグラウンドで実行するシェルスクリプトには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
のすべての出力が続く)ようにしたい。出力をファイルに書き込んでからファイルを印刷する必要がありますか、またはファイルに書き込まずにこれを行う方法はありますか?
とにかくすべての出力はファイルに書き込まれますが、ファイルを使用する方法notはわかりません。必要に応じて一時ファイルを使用します。例:
$ a=$(mktemp)
$ b=$(mktemp)
$ echo 1 >$a & echo 2 >$b & wait
$ cat $b
2
$ cat $a
1
mktemp
は2つの一時ファイルa
とb
を作成します。echo
コマンドは一時ファイルに書き込みます。その後、cat
を使用して、必要なときにいつでも印刷できます。出力。 stdoutとstderrの両方をリダイレクトする場合は、代わりに&>
を使用します。
さて、システムはこれを達成するためにとにかくファイルに書き込んでいます。それらは単なる一時ファイルです。ただし、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
}