passer stdout en tant que nom de fichier pour la ligne de commande util?

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?

Solution 1: Utilisation de la substitution de processus

La méthode la plus pratique consiste à utiliser la substitution de processus. En bash, la syntaxe est la suivante:

 foo -o >(other_command) 

Solution 2: Utilisation explicite des canaux nommés

Vous pouvez le faire explicitement / manuellement comme suit:

  1. Créez un canal nommé à l’aide de la commande mkfifo .

     mkfifo my_buf 
  2. Lancez votre autre commande avec ce fichier en entrée

     other_command < my_buf 
  3. Exécutez foo et laissez-le écrire sa sortie dans my_buf

     foo -o my_buf 

Solution 3: Utilisation de /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é 🙂

  1. Créer le tuyau

     $ mknod -p mypipe 
  2. Démarrer le processus qui lit à partir du tuyau

     $ second-process < mypipe 
  3. 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é.