Je travaille avec un utilitaire de ligne de commande qui nécessite de passer le nom d’un fichier pour écrire la sortie vers, par exemple
foo -o output.txt
La seule chose qu’il écrit dans stdout
est un message indiquant qu’il a été exécuté avec succès. Je voudrais pouvoir output.txt
tout ce qui est écrit vers output.txt
vers un autre utilitaire de ligne de commande. Ma motivation est que output.txt finira par être un fichier de 40 Go que je n’ai pas besoin de conserver, et que je préfère les traiter plutôt que de travailler sur des fichiers massifs de manière progressive.
Y at-il un moyen dans ce scénario de output.txt
sortie réelle (c.-à-d. output.txt
) vers une autre commande? Puis-je transmettre comme par magie stdout
comme argument de fichier?
La méthode la plus pratique consiste à utiliser la substitution de processus. En bash, la syntaxe est la suivante:
foo -o >(other_command)
Vous pouvez le faire explicitement / manuellement comme suit:
Créez un canal nommé à l’aide de la commande mkfifo
.
mkfifo my_buf
Lancez votre autre commande avec ce fichier en entrée
other_command < my_buf
Exécutez foo
et laissez-le écrire sa sortie dans my_buf
foo -o my_buf
/dev/stdout
Vous pouvez également utiliser le fichier de périphérique /dev/stdout
comme suit
foo -o /dev/stdout | other_command
Les canaux nommés fonctionnent bien, mais vous disposez d’une syntaxe plus directe et plus accessible via la substitution de processus bash qui a l’avantage supplémentaire de ne pas utiliser un canal nommé permanent qui doit être supprimé ultérieurement (la substitution de processus utilise des canaux nommés temporaires en arrière-plan):
foo -o >(other command)
De même, si vous souhaitez canaliser la sortie vers votre commande et enregistrer également la sortie dans un fichier, vous pouvez le faire:
foo -o >(tee output.txt) | other command
Par souci de rendre stackoverflow heureux laissez-moi écrire une phrase assez longue parce que ma solution proposée ne comporte que 18 caractères au lieu des 30+ requirejs
foo -o /dev/stdout
Vous pouvez utiliser la magie d’UNIX et créer un canal nommé 🙂
Créer le tuyau
$ mknod -p mypipe
Démarrer le processus qui lit à partir du tuyau
$ second-process < mypipe
Démarrer le processus, qui écrit dans le tuyau
$ foo -o mypipe
J’utilise / dev / tty comme nom de fichier de sortie, ce qui équivaut à utiliser / dev / nul / lorsque vous ne voulez rien sortir du tout. Alors | et vous avez terminé.