Lié à une question que j'ai posée sur Stack Overflow: Passer plusieurs lignes de code à wsadmin.sh? .
J'ai, en tant que chaîne, quelques lignes d'entrée dont j'ai besoin pour alimenter une commande. Cependant, la commande n'accepte qu'un fichier plein d'entrée.
Existe-t-il un moyen de stocker les lignes dans un fichier temporaire ou un tube qui ne sera jamais réellement écrit sur le disque, puis de l'introduire directement dans le programme?
Comment dois-je procéder pour acquérir le tuyau, y introduire l'entrée, passer ce tuyau à la commande, puis se débarrasser du tuyau?
linux
command-line
bash
ArtOfWarfare
la source
la source
Réponses:
Une autre solution consiste à utiliser la substitution de processus dans Bash. Si votre système a nommé des canaux, vous pouvez utiliser cette fonctionnalité.
Il est utilisé comme ceci:
où
list
est une séquence de commandes shell (en fait des pipelines; les détails complets sont ici ).list
sera exécuté et sa sortie sera connectée au tuyau. Le nom du canal est ensuite transmis à votre programme.REMARQUE: les espaces ne sont pas autorisés entre
<
et(
.(L'autre substitution
>(list)
fonctionne également comme prévu.)Dans votre cas spécifique, vous pouvez utiliser
bien que vous puissiez trouver la solution de @ meuh plus élégante.
Mise à jour: de nombreux exemples d'utilisation sont disponibles dans le Guide de script avancé de Bash .
la source
Vous pouvez utiliser un bash here-doc . Par exemple,
Si vous avez quelque chose dans une variable bash, vous pouvez également l'interpoler: par exemple
<<<"path is $PATH"
.Si votre commande insiste sur un nom de fichier, vous pouvez le lui donner
/dev/stdin
. Par exemple:produit la sortie:
s/b/b/
.la source
stdin
, et sinon, cela ne fonctionnera pas. J'espère que le PO clarifie."-f" option must be followed by a file name.
-f
un nom de fichier, indiquez-le/dev/stdin
. Voir mon montage./dev/stdin
suggestion. Le programme que j'essaie d'appeler n'accepte qu'un nom de fichier, j'ai donc combiné/dev/stdin
avec un hérédoc.Selon le contenu du script, vous pourrez peut- être utiliser le nom de fichier spécial - (moins) qui signifie stdin
Une autre méthode qui peut fonctionner pour vous consiste à ouvrir le fichier
/dev/fd/0
qui représente à nouveau stdin .Une troisième option peut être de créer un FIFO (First In First Out). C'est comme un fichier, mais il a deux extrémités: vous écrivez à une extrémité et lisez de l'autre.
la source
-
cette façon - ce n'est pas une fonction du shell ou du système d'exploitation. Bien sûr, la plupart des utilitaires Linux standard suivent cette convention, pour autant que je sache.expect
.<()
solution, mais plus explicites - ce qui peut être très utile!Il existe une autre option similaire à la
mycmd -
solution, mais même pour les programmes qui ne traitent pas-
spécifiquement:/dev/stdin
semble être lié au système d'exploitation et cela fonctionne pour moi sur Debian GNU / Linux, mais je ne sais pas où cela fonctionnera également.la source
^D
?^D
est une notation courante pour appuyer sur Ctrl-D. ^ D a ici la sémantique de "fin du flux d'entrée". Il est probablement plus souvent vu dans^C
ou^Z
qui signifie appuyer sur Ctrl-C respectivement pour appuyer sur Ctrl-Z./dev/stdin
puis les fermer?cat content | mycmd /dev/stdin
. Imaginez simplement des commandes différentescat
qu'ici.