Comment puis-je envoyer des caractères à une command comme s'ils provenaient d'un file?

Comment puis-je envoyer des caractères à une command comme s'ils provenaient d'un file?

Par exemple, j'ai essayé:

wc < "apple pear orange" -bash: apple pear orange: No such file or directory 

Dans les shells qui supportent ici les strings , y compris bash , zsh et ksh93 , vous pouvez utiliser

 wc <<< "apple pear orange" 

Deux autres approches (qui permettent l'input sur plusieurs lignes sans effort supplémentaire):

  1. Utilisez un "ici document":

      $ wc << EOF
     pomme poire orange
     EOF
       1 3 18
     $ 

    La string EOF est un délimiteur. Vous pouvez utiliser n'importe quelle string; EOF est juste un choix conventionnel.

  2. Utilisez le tty comme input:

      $ wc
     pomme poire orange
     Ctrl + D
       1 3 18
     $ 

    Cela a l'inconvénient que le programme commence à s'exécuter, et commence à lire l'input, dès que vous tapez son nom. Cela peut être déconcertant; par exemple:

      $ grep v
     Le renard brun rapide (tapé)
     saute par-dessus (tapé)
     saute par-dessus (Ceci est sortie de grep!)
     le chien paresseux.  (tapé)
     Ctrl + D
     (Pas de sortie ici)
     $ 

Bien qu'il existe plusieurs solutions valides ici, une autre syntaxe qui peut être utile parfois, est d'exécuter une command dans <() . Cela vous permettrait de créer plus d'un object de descripteur de file sur une command line.

Cela peut être utile lorsque vous faites quelque chose comme comparer de longues strings de text ou si vous voulez différencier un contenu qui ne figure pas dans un file.

Par exemple, comparer les files hôtes sur deux nœuds sans avoir à copyr le file hosts sur l'hôte local:

 diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts') 

Le < redirige un file vers STDIN et le () crée un sous-shell pour exécuter la command entre les parenthèses. C'est le STDOUT du sous-shell qui est passé à STDIN de la command en cours d'exécution.

C'est un moyen plus facile de créer plus d'une input «file» à une command que d'essayer d'utiliser plusieurs documents ici, ou d'essayer d'écho plusieurs commands à un pipeline à la command finale.

vous pouvez utiliser un tuyau

 echo "apple pear orange" | wc 

Vous voudrez peut-être utiliser quelque chose de similaire à attendre. Voici un exemple simple d'ouverture d'une session telnet distante, en attente de l'invite, envoi de certaines données, attente d'une réponse, mise en veille et sortie.

 #!/usr/bin/expect spawn telnet localhost 8555 expect "Escape character is '^]'." send "Hello World\n" expect "Connection closed by foreign host." sleep 1