J'essaie de lire plusieurs éléments de l'utilisateur dans un script shell, sans chance. L'intention est de lire une liste de fichiers en premier (qui sont lues à partir du tuyau STDIN), puis de lire deux fois plus pour obtenir deux cordes de manière interactive. Ce que j'essaie de faire est de lire une liste de fichiers à joindre dans un email, puis du sujet et enfin l'organisme email.
jusqu'à présent, j'ai ceci: p>
photos=($(< /dev/stdin)) echo "Enter message subject" subject=$(< /dev/stdin) echo "Enter message body" body=$(< /dev/stdin)
4 Réponses :
Comme il est possible que vous ayez un nombre varié de photos, pourquoi pas seulement demander aux champs connus d'abord, puis lisez «tout le reste». Il est beaucoup plus facile que d'essayer d'obtenir les deux derniers champs d'une longueur inconnue de manière interactive. P>
La raison qui ne fonctionne pas pour moi est que j'essaie d'utiliser un tuyau pour réussir la liste des photos. Si je lis simplement les champs de ces champs avant la liste, les deux premières photos de la liste finissent par être soumise et email, 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.)
Vous devriez pouvoir utiliser lire code> pour inviter le sujet et le corps:
Merci. Cela fonctionne si je saisi les données de manière interactive. Cependant, si j'utilise un tuyau (qui est ce que je suis réellement intéressé par), ce n'est pas le cas. Par exemple, j'essaie de faire ceci: CAT / TMP / Quelconphotoïdes | Sed -e 's /(.*)/ DSC_ \ 1.JPG /' | SendPics.sh Alors que je pouvais contourner le problème de Cut'N'pasting, j'ai passé suffisamment de temps à ce que je considère maintenant une sorte de défi.
Tous ces besoins répondent à ajouter dev / tty code> à la fin de chaque
lisez code> instruction, alors c'est parfait.
Alors, ce que j'ai fini par faire est basé sur la réponse de l'EZPZ et cette doc: http://www.faqs.org/docs/abs/html/io-redirection.html Fondamentalement, je vous invite les champs d'abord de / dev / tty, puis lisez STDIN, en utilisant le DUP-et -Close Trick: merci! p> p>
@Dennis Williamson avait une manière plus courte, avec l'ajout de dev / tty code> à la fin des déclarations code> code>.
# Prompt and read two things from the terminal (not from stdin), then read stdin. # The last line uses arrays, so is BASH-specific. The read lines are portable. # - Ian! D. Allen - idallen@idallen.ca - www.idallen.com read -p "Enter message subject: " subject </dev/tty read -p "Enter message body: " body </dev/tty photos=($(</dev/stdin))
Vous ne lisez pas Stdin plusieurs fois, vous lisez le terminal et STDIN séparément. Le phrasé de la question devrait être fixé pour refléter que, de sorte qu'il ne met pas en erreur les gens ici qui pensent que vous relisez réellement STDIN.
édité de cette façon
Le sujet de la question est toujours "lisant stdin plusieurs fois" et ce n'est pas la réponse que vous voulez. S'il vous plaît changez-le à quelque chose comme "Lire de STDIN et TERMINAL IN BASH".