Tromper un programme de ligne de commande Unix en acceptant un stream de fichiers

Situation hypothetique. J’ai un programme en ligne de commande dans * nix (Linux, BSD, etc.). Il a été écrit pour que vous passiez un fichier texte en argument

$ program file.txt 

Exécutez le programme, il regarde le texte dans file.txt .

Est-il possible de “tromper” ce programme pour qu’il accepte des entrées d’un stream de fichiers plutôt que de lire un fichier via un disque? Je suis assez à l’aise avec les pipes unix pour faire des choses, mais leurs composants ont toujours quelque chose de mystérieux, ce qui fait que je ne peux pas dire (définitivement) oui ou non à la question ci-dessus.

bash vous permet de faire ceci:

 program <(otherprogram) 

Cela utilise la sortie d'un autre otherprogram comme contenu d'un fichier passé au program .

Vous pouvez être intéressé par les canaux nommés :

 mkfifo myPipe program myPipe & anotherProgram > myPipe 

est équivalent à:

 anotherProgram | program 

Si votre program n’est pas codé pour accepter une entrée standard, cela ne fonctionnera pas même si vous utilisez des canaux nommés ou une substitution de processus

En plus de la supercherie gérée par shell des autres réponses:

Certains systèmes Unix ont les fichiers spéciaux /dev/stdin , et vous pouvez exécuter par exemple

 otherprogram | program /dev/stdin 

D’autres (par exemple, Linux) peuvent avoir /proc/self/fd/0 qui peut être utilisé de la même manière.

Les deux échoueront si stdin est fermé avant que le fichier sur la ligne de commande ne soit ouvert, mais cela sera extrêmement rare. Il y aura beaucoup plus de chances que cela échoue car le programme s’attend à seek() le fichier, qui ne fonctionne pas sur les tuyaux.

Si votre shell est zsh, vous avez une autre option.

 program =(otherprogram) 

Ce qui fera tout le travail de mettre en place un fichier d’entrée temporaire et de le supprimer après la fin du program . Cela fonctionnera avec seek() , mais peut prendre temporairement plus d’espace.