想要依次打印两个后台 shell 函数的输出

想要依次打印两个后台 shell 函数的输出

我在后台运行的 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创建两个临时文件abecho命令将写入临时文件,然后您可以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  
}  

相关内容