web-dev-qa-db-fra.com

Voulez-vous imprimer la sortie de deux fonctions de fond en même temps

J'ai deux fonctions dans mes scripts Shell que j'exécute en arrière-plan:

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

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

foo &
bar &
wait

La sortie est imprimée à la sortie de stdout ou stderr, il y a donc beaucoup de chevauchement:

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

Je voudrais que la sortie soit imprimée de manière séquentielle (toutes les sorties de foo suivies de toutes les sorties de bar) afin de faciliter leur lecture. Dois-je écrire la sortie dans un fichier, puis l'imprimer, ou existe-t-il un moyen de le faire sans écrire dans des fichiers?

1
D Day

De toute façon, chaque sortie est écrite dans un fichier, je ne sais pas comment pas utiliser les fichiers. J'utiliserais des fichiers temporaires au besoin, par exemple:

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

mktemp crée deux fichiers temporaires a et b, les commandes echo écrivent dans les fichiers temporaires, vous pouvez ensuite utiliser cat pour les imprimer à tout moment. le résultat. Si vous souhaitez rediriger stdout et stderr, utilisez plutôt &>.

4
dessert

Eh bien, le système écrit quand même dans des fichiers pour accomplir cela; ce ne sont que des fichiers temporaires. Cependant, vous pouvez avoir le processus foo en sortie dans un fichier et le renommer une fois terminé. Demandez à bar de surveiller le changement de nom du fichier et lorsque foo termine le changement de nom, bar affiche la sortie foo, puis affiche sa propre sortie, à 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