2010-01-02 2 views
5

J'essaye de lire de stdin plusieurs fois dans un script de coquille, sans succès. L'intention est de lire d'abord une liste de fichiers (qui sont lus à partir du tube stdin), puis de lire deux fois plus pour obtenir deux chaînes de manière interactive. (Ce que j'essaie de faire est de lire une liste de fichiers à joindre dans un e-mail, puis le sujet et enfin le corps de l'e-mail).lecture stdin plusieurs fois dans bash

Jusqu'à présent, j'ai ceci:

photos=($(< /dev/stdin)) 

echo "Enter message subject" 
subject=$(< /dev/stdin) 

echo "Enter message body" 
body=$(< /dev/stdin) 

(plus l'erreur de vérification du code que je ne pas préciser pour succintness)

Cependant, cela devient un sujet vide et le corps vraisemblablement parce que les deuxième et troisième redirections se EOF .

J'ai essayé de fermer et rouvrir stdin avec < & - et d'autres choses, mais cela ne semble pas fonctionner de cette façon.

J'ai même essayé d'utiliser un séparateur pour la liste des fichiers, en utilisant une boucle "while; read line" et de sortir de la boucle lorsque le séparateur a été détecté. Mais ça n'a pas marché non plus (??).

Des idées pour construire quelque chose comme ça?

Répondre

5

Alors ce que je fini par faire est basée sur la réponse de EZPZ et ce doc: http://www.faqs.org/docs/abs/HTML/io-redirection.html Fondamentalement, je PROMPT pour les champs d'abord de/dev/TTY, puis lire stdin, en utilisant l'astuce dup-agrippante:

# close stdin after dup'ing it to FD 6 
exec 6<&0 

# open /dev/tty as stdin 
exec 0</dev/tty 

# now read the fields 
echo "Enter message subject" 
read subject 
echo "Enter message body" 
read body 

# done reading interactively; now read from the pipe 
exec 0<&6 6<&- 
fotos=($(< /dev/stdin)) 

Merci!

2

Puisqu'il est possible que vous ayez un nombre variable de photos, pourquoi ne pas demander d'abord les champs connus, puis lire 'tout le reste'. C'est beaucoup plus facile que d'essayer d'obtenir les deux derniers champs d'une longueur inconnue de manière interactive.

+0

La raison qui ne fonctionne pas pour moi est que j'essaie d'utiliser un tuyau pour passer la liste des photos. Si je lis simplement ces champs avant la liste, les deux premières photos de la liste finissent par être soumises et envoyées par mail, ce qui n'est pas ce que je veux. (Bien sûr, je pourrais dicter que le sujet et le corps doivent être passés dans les deux premières lignes du tuyau d'entrée, mais c'est beaucoup trop moche pour moi.) – alvherre

3

Vous devriez pouvoir utiliser read pour demander le sujet et le corps:

photos=($(< /dev/stdin)) 

read -rp "Enter message subject" subject 

read -rp "Enter message body" body 
+0

Merci. Cela fonctionne si je saisis les données de manière interactive. Cependant, si j'utilise un tuyau (ce qui m'intéresse vraiment), ce n'est pas le cas. Par exemple, j'essaye de faire ceci: cat/tmp/somephotoids | sed -e 's /\(.*\)/ DSC_ \ 1.jpg /' | sendpics.sh Bien que je puisse contourner le problème par cut'n'pasting, j'ai passé assez de temps à le faire de cette façon que je considère maintenant comme une sorte de défi. – alvherre

Questions connexes