Il est bien connu de canaliser la sortie standard d'un processus dans une autre entrée standard de processus:
proc1 | proc2
Mais que faire si je veux envoyer l'erreur standard de proc1 à proc2 et laisser la sortie standard aller à son emplacement actuel? Vous penseriez bash
avoir une commande du type:
proc1 2| proc2
Mais, hélas, non. Y a-t-il un moyen de faire ça?
rc
, qui est un autre shell. Par exemple:proc1 |[2] proc2
. N'est-ce pas sympa? Pasbash
dedans cependant.Réponses:
Il existe également une substitution de processus . Ce qui fait qu'un processus remplace un fichier.
Vous pouvez envoyer
stderr
vers un fichier comme suit:Mais vous pouvez remplacer le fichier par un processus comme suit:
Voici un exemple concret qui envoie
stderr
à la fois à l'écran et s'ajoute à un fichier journalla source
weston --help 2> >(less)
), et cela a brisé ma coquille, j'ai dû quitter et me reconnecter.weston --help
etless
s'attendent à avoir une interaction avec le clavier mais qu'un seul d'entre eux la reçoit, alors vous pouvez être dans une situation délicate. Essayezgrep
plutôt de faire des tests avec quelque chose comme . De plus, vous constaterez peut-être que les deux entrées souris / clavier vont de toute façon à la deuxième commande plutôt qu'à Weston.Vous pouvez utiliser l'astuce suivante pour permuter
stdout
etstderr
. Ensuite, vous utilisez simplement la fonctionnalité de canal standard.Pourvu
stdout
etstderr
tous les deux pointés vers le même endroit au départ, cela vous donnera ce dont vous avez besoin.Ce que fait le
x>y
bit, c'est de changer le descripteur de fichierx
afin qu'il envoie maintenant ses informations à l'endroit où le descripteur de fichiery
pointe actuellement. Pour notre cas spécifique:3>&1
crée un nouveau handle3
qui sortira vers le handle actuel1
(stdout d'origine), juste pour le sauvegarder quelque part pour le dernier point ci-dessous.1>&2
modifie le handle1
(stdout) en sortie vers le handle actuel2
(stderr d'origine).2>&3-
modifie le handle2
(stderr) pour afficher le handle actuel3
(stdout d'origine) puis ferme le handle3
(via le-
à la fin).C'est en fait la commande swap que vous voyez dans les algorithmes de tri:
la source
1>&2-
ici plutôt que simplement1>&2
? Je ne comprends pas pourquoi nous voudrions fermer fd2
, si nous allons simplement le rouvrir / le réaffecter immédiatement.Bash 4 a cette fonctionnalité:
zsh a également cette fonctionnalité.
-
Avec d'autres shells / plus anciens, entrez simplement ceci explicitement comme
FirstCommand 2> & 1 | AutreCommande
la source
OtherCommand
écrit les données combinées quelque part, peut-être ailleurs. Ce ne sont donc pas les mêmes données, et elles vont potentiellement ailleurs. C'est à peu près le contraire du souhait du PO, n'est-ce pas?proc1
sorties vers stdout et stderr et que vous voulez que stderr aille vers le stdin deproc2
(c'est là que va le stdout de proc1), alors ma réponse accomplit cela. J'ai donné au PO ce qu'il avait demandé , peut-être pas ce qu'il voulait demander. C'est là que réside l'ambiguïté potentielle. L'OP a accepté la réponse qui permute stdout et stderr ce qui n'est pas ce qu'il a demandé.L'échange est excellent car il résout le problème. Juste au cas où vous n'auriez même pas besoin de la sortie standard d'origine, vous pouvez le faire de cette façon:
L'ordre est vital; vous ne voudriez pas:
Comme cela redirigera tout vers
/dev/null
!la source
Aucun de ceux-ci n'a vraiment très bien fonctionné. La meilleure façon que j'ai trouvée de faire ce que vous vouliez est:
Cela ne fonctionne que dans les cas où
command
aucune saisie au clavier n'est nécessaire. par exemple:mettrait les erreurs gzip en moins
la source