J'observe la sortie de ma commande compliquée avec less
, le problème est la stderr
se perd. stderr
les lignes sont normalement listées entre les stdout
lignes à l'intérieur less
. Je voudrais qu'ils soient imprimés sur la console, et à ma sortie less
, pour les voir ensemble.
Je me rends compte qu'il n'y a peut-être pas de solution à cela, j'ai lu tee
et multitee
mais aucune chance jusqu'à présent.
stderr
est redirigé versstdout
, toutes les sorties versstderr
seront mélangées avec la sortie normale activéestdout
. La canalisation de cette sortieless
affichera les deux.less
pour repeindre l'écran.Réponses:
Peut être
Addenda
Voici une clarification pour les gens qui négligent de lire attentivement la question et qui n'ont pas lu le commentaire de clarification du PO ci-dessus.
haelix a souligné:
et, dans un commentaire pour les premiers intervenants, a écrit:
Le problème est probablement spécifique à la plate-forme, c'est certainement quelque chose que j'ai vécu sur les anciennes plates-formes Unix SVR4.
Si, sur de telles plateformes, vous faites quelque chose comme
tous les messages d'erreur (par exemple les autorisations de répertoire) apparaissent comme ceci en moins
afin que les lignes de sortie soient masquées par des messages d'erreur.
Si vous actualisez la page, les lignes de sortie s'affichent correctement mais vous perdez les messages d'erreur. Lorsque vous quittez moins, l'écran est effacé, à l'exception d'une invite de commande.
Si vous faites quelque chose comme
Les messages d'erreur sont entremêlés avec la sortie standard. Encore une fois lorsque vous quittez moins, l'écran est vide.
Si vous voulez d'abord parcourir uniquement la sortie standard en moins, puis voir les messages d'erreur après avoir quitté less, vous avez besoin d'une solution différente.
C'est ce que je proposais provisoirement dans ma réponse originale en deux lignes.
la source
Vous devez rediriger
stderr
versstdout
:Consultez le manuel de votre shell (par exemple
man bash
.)la source
il suffit de dire au shell de rediriger fd 2 vers fd 1 (stderr vers stdout)
la source
Une chose qui manquait jusqu'à présent dans toutes les réponses est la raison pour laquelle cela se produit. Le problème ici est une sorte de condition de concurrence entre la sortie du processus
stderr
et l'less
affichage de la sortiestdout
sur le terminal. Siless
commence à s'afficher une fois que toutes les sorties destderr
ont été imprimées sur le terminal,less
cela les conservera et vous pourrez voir les messages après la sortieless
. OTOH siless
a déjà commencé à afficher des éléments, les messages d'erreur s'entremêlent avecless
la sortie de et rien n'est conservé après lesless
sorties (carless
préserve simplement le terminal tel qu'il était avant son démarrage et ne sait rien des messages d'erreur qui se sont produits entre les deux).Vous pouvez le voir facilement, par exemple
Tous les messages d'erreur "Autorisation refusée" se mélangent avec la
less
sortie et rien ne sera là après votre sortie. Si tu faistous (ou au moins la plupart) des messages d'erreur ont été imprimés sur le terminal avant d'
less
avoir la possibilité d'afficher la sortie et vous verrez les messages d'erreur par la suite.Bien sûr, vous ne voulez généralement pas attendre 10 secondes avant de commencer
less
, mais avec Linux, vous pouvez également fournir des valeurs fractionnaires pour le temps d'attente, et avec des processus rapides, souvent quelque chose d'aussi peu quesleep 0.1
suffisant pour éviter la condition de concurrence. (Mais, bien sûr, si vous voulez ou devez être du côté vraiment sûr, utilisez la solution de RedGrittyBrick).la source
Vous devez comprendre le concept de "descripteurs de fichiers". Habituellement, une application Unix démarre avec trois descripteurs de fichiers spéciaux:
Le "tuyau"
|
dans la coque se connectestdout
d'un processusstdin
au suivant.De par leur conception, les erreurs ne sont pas transmises au
stdin
processus suivant. Souvent, ils n'auront pas de sens pour l'application suivante et ne devraient pas être cachés à l'utilisateur.Si vous voulez mélanger les erreurs dans stdout, vous pouvez utiliser par exemple
2>&1
, qui dit essentiellement "ajouter stderr à stdout". Par exempledevrait également inclure la sortie d'erreur de fichiers inaccessibles.
vous donnera uniquement les erreurs.
la source
Je suis confus au sujet de votre question, pour autant que je puisse dire que votre comportement souhaité est celui par défaut.
Quand j'utilise
pour obtenir un test simple,
fait exactement ce que vous demandez. C'est que je vois
dans
less
etquand je quitte
less
la source
echo info ; echo error 1>&2
) et répétez le test: les deux lignes sont dirigées vers moins.Il se trouve que je rencontre ce problème dans l'un de mes Debian 5.0 récemment. par exemple, ls abc | moins je trouve que le message d'erreur va dans moins, ce qui contre ma connaissance.
Après quelques tentatives, j'ai trouvé que c'était juste quelque chose lié aux tampons d'écran. stderr n'entre PAS dans moins en fait. Vous pouvez utiliser les touches fléchées Haut ou Bas (ou j / k) pour démontrer.
la source