Je sais comment rediriger vers un fichier et utiliser tee; au niveau de base. Donc
$ alias outanderr='bash -c "echo stdout >&1; echo stderr >&2"'
# A fake "application" displaying both output and error messages.
$ outanderr 1>file # redirect stdout to a file, display stderr
stderr
$ outanderr 2>file # redirect stderr to a file, display stdout
stdout
$ outanderr 1>file 2>&1 # redirect both to a file, display nothing
$ outanderr | tee file; echo "-- file contents --" && cat file
# redirect stdout to a file, display both (note: order is messed up)
stderr
stdout
-- file contents --
stdout
$ outanderr 2>&1 | tee file; echo "-- file contents --" && cat file
# redirect both to a file, display both
stdout
stderr
-- file contents --
stdout
stderr
La question est: quoi écrire à la place des points d'interrogation pour obtenir la sortie ci-dessous:
$ outanderr ???; echo "-- file contents --" && cat file
# redirect both to a file, display stderr
stderr
-- file contents --
stdout
stderr
Constaints:
- En supposant que bash.
- La commande doit être conservée dans le dossier.
- le contenu de stderr est affiché en temps réel ligne par ligne, c'est-à-dire sans mise en mémoire tampon.
- Des fichiers de script distincts peuvent être utilisés.
- La magie peut être nécessaire.
bash
files
io-redirection
TWiStErRob
la source
la source
outanderr
avez-vous sur le programme?outanderr
c'est juste un alias qui imprime une ligne vers stdout et une autre vers stderr. L'idée (si c'est possible) est de construire une solution générique qui pourrait fonctionner avec n'importe quel programme, sans les modifier.Réponses:
Pour des tests faciles:
Modifier 1:
Cela fonctionne en écrivant stdout (uniquement) dans le fichier, en faisant sterrout stdout pour qu'il passe par le tube et en demandant à tee d'écrire sa sortie dans le même fichier.
Les deux écritures doivent être effectuées en mode ajout (
>>
au lieu de>
) sinon les deux écraseraient la sortie de l'autre.Comme le tube est un tampon, rien ne garantit que la sortie apparaît dans le fichier dans le bon ordre. Cela ne changerait même pas si une application était connectée aux deux descripteurs de fichiers (deux canaux). Pour un ordre garanti, les deux sorties devraient passer par le même canal et être marquées respectivement. Ou vous auriez besoin de trucs vraiment fantaisistes:
/dev/null
. Les sorties de l'application seraient séparées en la parcourantstrace -f -s 32000 -e trace=write
. Vous devrez inverser l'échappement dans ce cas. Inutile de dire que l'application ne s'exécute pas plus rapidement en étant tracée.la source
stdout
etstderr
àtee
, ou est-ce que je manque quelque chose? Je pense que l'exigence du PO est detee
stderr
seulement.