8
votes

lire plusieurs articles semi-interactifs de l'utilisateur à bash

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)


3 commentaires

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".


4 Réponses :


2
votes

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.


1 commentaires

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.)



3
votes

Vous devriez pouvoir utiliser lire pour inviter le sujet et le corps: xxx


2 commentaires

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 à la fin de chaque lisez instruction, alors c'est parfait.



6
votes

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: xxx

merci!


1 commentaires

@Dennis Williamson avait une manière plus courte, avec l'ajout de à la fin des déclarations .



0
votes
# 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))

0 commentaires