Comment envoyer des caractères à une commande comme s'ils venaient d'un fichier?
Par exemple, j'ai essayé:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
Dans les shells qui prennent en charge ici les chaînes , y compris bash
, zsh
et ksh93
, vous pouvez utiliser
wc <<< "apple pear orange"
Deux autres approches (qui permettent une entrée sur plusieurs lignes sans effort supplémentaire):
Utilisez un "document ici":
La
EOF
chaîne est un délimiteur. Vous pouvez utiliser n'importe quelle chaîne;EOF
est juste un choix conventionnel.Utilisez le tty comme entrée:
Cela présente l'inconvénient que le programme démarre et démarre la lecture de l'entrée dès que vous tapez son nom. Cela peut être déconcertant; par exemple:
la source
<<<
formulaire permet également la saisie sur plusieurs lignes sans effort supplémentaire, car la"
chaîne -enclosed peut contenir des retours à la ligne. Bien sûr, le<< EOF
formulaire (la syntaxe originale ici-doc) est plus facile à lire si vous avez une entrée sur plusieurs lignes.<<<
word
- bien sûr, dans le contexte du shell, aword
peut être une chaîne entre guillemets, contenant des espaces et des retours à la ligne! Oh! C'est tellement évident que cela va sans dire (et, en fait, je ne le vois pas du tout mentionné dans la page de manuel). :-( Merci de me l'avoir signalé!word
est défini dans la page de manuel comme "Une séquence de caractères considérée comme une seule unité par le shell" (aka "token"), et vous devez savoir que les chaînes entre guillemets sont traitées comme "une seule unité" dans le sens pertinent (après traitement de barre oblique inverse, expansion variable, etc. "Mais en fait, c'est tout le but des guillemets doubles dans le shell. (Les guillemets simples protègent également contre l'expansion.) Le modèle de traitement du shell est très bien pensé et tout sauf simple.Bien qu'il existe plusieurs solutions valides ici, une autre syntaxe qui peut parfois être utile consiste à exécuter une commande dans
<()
. Cela vous permettrait de créer plus d'un objet descripteur de fichier sur une ligne de commande.Cela peut être utile lorsque vous faites quelque chose comme comparer de longues chaînes de texte ou si vous souhaitez différencier du contenu qui ne se trouve pas dans un fichier.
Par exemple, en comparant les fichiers hôtes sur deux nœuds sans avoir à copier le fichier hôtes sur l'hôte local:
Le
<
redirige un fichier vers STDIN et()
crée un sous-shell pour exécuter la commande entre parenthèses. C'est le STDOUT du sous-shell qui est passé à STDIN de la commande en cours d'exécution.C'est un moyen plus facile de créer plus d'un "fichier" d'entrée pour une commande que d'essayer d'utiliser plusieurs documents ici ou d'essayer de faire écho à plusieurs commandes d'un pipeline vers la commande finale.
la source
<fileorpathname
redirige stdin, mais<(subcmd)
ne le fait pas; il remplace un nom qui, lorsqu'il est ouvert par le programme, peut lire stdout depuis subcmd.< <(subcmd)
(espace requis) redirige stdin de ce fichier, presque commesubcmd |
. Vousdiff
pouvez lire l' une de ses entrées depuis stdin en spécifiant un argument de-
mais pas les deux.cmd <(cmd2 ...)
etcmd < <(cmd2 ...)
. Le premier permet aux données dérivées (la sortie de cmd2) d'être utilisées à la place d'un nom de fichier. Ce dernier est équivalent àcmd2 ... | cmd
. Les commandes doivent être écrites pour accepter explicitement l'entrée stdin et beaucoup ne le sont pas. Cela est particulièrement vrai pour les scripts shell.vous pouvez utiliser un tuyau
la source
Vous voudrez peut-être utiliser quelque chose de similaire à attendre. Voici un exemple simple d'ouverture d'une session Telnet distante, d'attente de l'invite, d'envoi de données, d'attente d'une réponse, de mise en veille et de sortie.
la source