![想要依次打印两个后台 shell 函数的输出](https://linux22.com/image/1010501/%E6%83%B3%E8%A6%81%E4%BE%9D%E6%AC%A1%E6%89%93%E5%8D%B0%E4%B8%A4%E4%B8%AA%E5%90%8E%E5%8F%B0%20shell%20%E5%87%BD%E6%95%B0%E7%9A%84%E8%BE%93%E5%87%BA.png)
我在后台运行的 shell 脚本中有两个函数:
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
无论如何,每个输出都会写入文件,我不知道有什么方法不是使用文件。我会根据需要使用临时文件,例如:
$ a=$(mktemp)
$ b=$(mktemp)
$ echo 1 >$a & echo 2 >$b & wait
$ cat $b
2
$ cat $a
1
mktemp
创建两个临时文件a
和b
,echo
命令将写入临时文件,然后您可以cat
在需要输出时随时使用它们进行打印。如果您想重定向 stdout 和 stderr,请使用&>
。
答案2
好吧,系统无论如何都会写入文件来实现这一点;它们只是临时文件。但是,您可以将进程foo
输出到一个文件,并在完成后重命名。bar
观察该文件的重命名,当foo
重命名完成时,bar 输出输出foo
,然后打印自己的输出,如下所示:
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
}