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?
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 &>
.
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
}