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.