Je suis nouveau à bash et je ne peux pas pour la vie de moi comprendre comment exécuter une certaine commande, supposer ./fff
et imprimer des stdouts réguliers avant stderr (je suis confus quant au sens moi-même)
par exemple
$ printf "I am a\ndrill\n" > fff;
$ cat fff nofile fff nofile fff
I am a
drill
cat: nofile: No such file or directory
I am a
drill
cat: nofile: No such file or directory
I am a
drill
doit imprimer comme:
I am a
drill
I am a
drill
I am a
drill
cat: nofile: No such file or directory
cat: nofile: No such file or directory
Je comprends que je dois d'abord rediriger ma sortie vers un fichier, puis ajouter l'erreur au même fichier, mais c'est la sortie que j'obtiens pour
$ cat ./foo nofile ./foo nofile ./foo <<< $(touch fin) > see 2>> see
I am a
drill
I am a
drill
I am a
drill
ectory
cat: nofile: No such file or directory
cat
vraiment remplacé "a" par "certains"?Réponses:
Vous devrez de toute façon conserver la sortie stderr pour pouvoir l'afficher à la fin.
Un dossier me vient à l'esprit:
Ou la mémoire (ici à
sponge
partir demoreutils
):{...} 3>&1
: Dans le{...}
descripteur de fichier (fd) 3 points à la même ressource que l' originale stdout (afin que nous puissions l' utiliser pour restaurer stdout pourfff
).fff <redirs> | sponge <redirs>
,fff
et asponge
commencé simultanément (avec<redirs>
appliqué indépendamment) avecfff
stdout allant vers un tube etsponge
stdin étant l'autre extrémité du tube.2>&1
: fd 2 defff
(stderr) pointe vers la même chose que sur 1: le tuyau à ce point, doncfff
l'erreur passesponge
par ce tuyau.>&3
: maintenant stdout pointe vers la stdout d'origine (redirige vers ce qu'elle était)3>&-
: on ferme fd 2 quifff
n'a pas besoinsponge
accumule son entrée et l'affiche uniquement (sur sa sortie standard qui a été redirigée>&2
vers la même ressource que stderr) après avoir détecté eof surfff
sa sortie standard (supposé être à la fin et a déjà écrit toutes ses sorties sur sa sortie standard).Si
sponge
n'est pas installé, vous pouvez le remplacer parperl -0777 -pe ''
. Avec-pe ''
,perl
lit un enregistrement à la fois à partir de son entrée et l'écrit sur stdout.-0777
est le mode slurp où l'enregistrement (un seul dans ce cas) est l'entrée entière.la source
tee
au lieu desponge
...?tee
ne détient pas de données, il les écrit dès qu'il les lit.cat foo nofile foo nofile foo 2> ferr.txt; cat ferr.txt
. (Et vous ne voulez probablement pas utiliser>>
.) De plus, Stéphane fait le point excellent que vous devriez probablement fairecat ferr.txt >&2
pour écrire les informations stderr dans le stderr.