Existe-t-il un moyen de le faire efficacement dans bash:
/my/bash/script < echo 'This string will be sent to stdin.'
Je suis conscient que je pourrais canaliser la sortie de l'écho comme ceci:
echo 'This string will be piped to stdin.' | /my/bash/script
bash
redirect
stdin
io-redirection
Tous les travailleurs sont essentiels
la source
la source
echo
>
formulaire de redirection ouvrira un descripteur de fichier comme fd0
(stdin), alors que|
opens démarre un processus enfant et attache son stdout (fd 1) au stdin de l'autre processus. Ce fait peut avoir des conséquences non négligeables (pensez sur le partage des variables d'environnement?)Réponses:
Vous pouvez utiliser une ligne
heredoc
ce qui précède est le même que
ou vous pouvez rediriger la sortie d'une commande, comme
ou vous pouvez lire comme
ou simplement
la source
echo -e "\x01\x02..." | ./script
)<<<
? J'ai honte d'admettre que je ne l'ai jamais vu auparavant, et j'en suis totalement mystifié. J'ai essayé Google pour cela, mais mes résultats sont sans rapport.Tu étais proche
Pour une entrée multiligne, les here-docs conviennent:
Modifier les commentaires:
Pour obtenir une entrée binaire, dites
Si vous substituez
cat
à/my/bash/script
(ou bien laissez tomber le dernier tuyau), cette impression:Ou, si vous vouliez quelque chose d'un peu plus geek:
Quel est le sinus des 90 premiers degrés dans les flotteurs binaires de 4 octets
la source
xxd -r
(ouod
) pour filtrer le documentVous pouvez également utiliser
read
comme çala source
Solution
Vous voulez (1) créer une sortie stdout dans un processus (comme
echo '…'
) et (2) rediriger cette sortie vers l'entrée stdin d'un autre processus mais (3) sans utiliser le mécanisme de canal bash. Voici une solution qui correspond aux trois conditions:La
<
redirection d'entrée est normale pour stdin. La<(…)
substitution de processus est bash. En gros, il crée un/dev/fd/…
fichier avec la sortie de la commande de substitution et passe ce nom de fichier à la place de<(…)
, ce qui entraîne ici par exemplescript < /dev/fd/123
. Pour plus de détails, consultez cette réponseComparaison avec d'autres solutions
Un heredoc d'une ligne envoyé à stdin
script <<< 'string'
permet uniquement d'envoyer des chaînes statiques, pas la sortie d'autres commandes.La substitution de processus seule, comme dans
diff <(ls /bin) <(ls /usr/bin)
, n'envoie rien à stdin. Au lieu de cela, la sortie du processus est transmise en tant que contenu des fichiers créés en arrière-plan, équivalent à par exemplediff /dev/fd/10 /dev/fd/11
. Dans cette commande,diff
n'obtient aucune entrée de stdin.Cas d'utilisation
J'aime ça, contrairement au mécanisme de pipe, le
< <(…)
mécanisme permet de mettre la commande en premier et toutes les entrées après, comme c'est la norme pour l'entrée à partir des options de ligne de commande.Cependant, au-delà de l'esthétique de la ligne de commande, il existe certains cas où un mécanisme de tuyau ne peut pas être utilisé. Par exemple, lorsqu'une certaine commande doit être fournie comme argument d'une autre commande, comme dans cet exemple avec
sshpass
.la source
<<<
?Permet de taper plusieurs lignes dans un programme, sans que cette entrée ne soit enregistrée dans l'historique, ni visible dans
ps
. Appuyez simplement sur Ctrl + C lorsque vous avez terminé de taper pour terminercat
.la source
la source
function oline() { sed -e ":a;N;\$!ba ;s?\n? ?g"; }
. Troisièmement, ce sed serait beaucoup plus compréhensible avec awk:awk -F '\n' 'ORS=" " { print } END { printf "\n"}'