2010-01-02 10 views
5

Ich versuche, stdin mehrmals in einem Shell-Skript zu lesen, ohne Glück. Die Absicht ist, zuerst eine Liste von Dateien zu lesen (die von der stdin-Pipe gelesen werden), und dann noch zweimal zu lesen, um zwei Zeichenfolgen interaktiv zu erhalten. (Was ich versuche zu tun ist eine Liste von Dateien zu lesen, um sie in einer E-Mail anzuhängen, dann den Betreff und schließlich den E-Mail-Text).lesen stdin mehrmals in bash

Bisher habe ich dies:

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

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

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

(Plus Fehlercode überprüft, die ich für succintness weglassen)

Dies ist jedoch bekommt einen leeren Betreff und vermutlich, weil die zweite und dritte Umleitungen EOF erhalten .

Ich habe versucht, Stdin mit < & zu schließen und wieder zu öffnen - und Sachen, aber es scheint nicht so zu funktionieren.

Ich habe sogar versucht, ein Trennzeichen für die Liste der Dateien verwenden, mit einer "While; Zeile lesen" -Schleife und brechen Sie aus der Schleife, wenn das Trennzeichen erkannt wurde. Aber das hat auch nicht funktioniert (??).

Irgendwelche Ideen, wie man so etwas baut?

Antwort

5

Also, was ich auf ezpz Antwort Tun endete basiert und dieses doc: http://www.faqs.org/docs/abs/HTML/io-redirection.html ich für die Felder prompt Grundsätzlich zuerst von/dev/tty, und lesen Sie dann stdin mit dem Duplicate-Trick:

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

Vielen Dank!

2

Da es möglich ist, dass Sie eine unterschiedliche Anzahl von Fotos haben, fragen Sie zuerst nach den bekannten Feldern und lesen Sie dann "alles andere". Es ist viel einfacher als zu versuchen, die letzten beiden Felder einer unbekannten Länge auf interaktive Weise zu erhalten.

+0

Der Grund, der für mich nicht funktioniert, ist, dass ich versuche, eine Pipe zu verwenden, um die Liste der Fotos zu übergeben. Wenn ich einfach die Felder vor der Liste lese, sind die ersten beiden Fotos in der Liste Betreff und E-Mail-Text, was ich nicht möchte. (Natürlich könnte ich diktieren, dass das Subjekt und der Körper in den ersten beiden Zeilen der Eingangsleitung übergeben werden müssen, aber das ist viel zu hässlich für mich.) – alvherre

3

Sie sollten read der Lage sein, zu verwenden für das Thema und Körper zu veranlassen:

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

read -rp "Enter message subject" subject 

read -rp "Enter message body" body 
+0

Danke. Das funktioniert, wenn ich die Daten interaktiv eingabe. Wenn ich jedoch eine Pipe verwende (was ich eigentlich interessiert), tut es das nicht. Zum Beispiel versuche ich dies zu tun: cat/tmp/somephotoids | sed -e 's /\(.*\)/ DSC_ \ 1.jpg /' | sendpics.sh Während ich das Problem durch cut'n'pasting umgehen konnte, habe ich genug Zeit damit verbracht, es so zu machen, dass ich es jetzt als eine Art Herausforderung ansehe. – alvherre