2010-01-02 35 views
5

Tôi đang cố đọc từ stdin nhiều lần trong tập lệnh trình bao, không có may mắn. Mục đích là để đọc một danh sách các tập tin đầu tiên (được đọc từ ống stdin), và sau đó đọc hai lần nữa để có được hai chuỗi tương tác. (Những gì tôi đang cố gắng làm là đọc danh sách các tệp đính kèm trong email, sau đó là chủ đề và cuối cùng là nội dung email).đọc stdin nhiều lần trong bash

Cho đến nay tôi có điều này:

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

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

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

(cộng với kiểm tra lỗi mã mà tôi bỏ qua cho succintness)

Tuy nhiên, điều này trở nên một chủ đề trống và cơ thể có lẽ vì sự chuyển hướng thứ hai và thứ ba có được EOF .

Tôi đã cố gắng đóng và mở lại stdin với < & - và nội dung nhưng dường như không hoạt động theo cách đó.

Tôi thậm chí đã thử sử dụng dấu phân tách cho danh sách tệp, sử dụng vòng lặp "while; read line" và thoát khỏi vòng lặp khi dấu phân cách được phát hiện. Nhưng điều đó không có tác dụng (??).

Bất kỳ ý tưởng nào về cách tạo thứ gì đó như thế này?

Trả lời

5

Vì vậy, những gì tôi đã kết thúc làm là dựa trên câu trả lời ezpz và doc này: http://www.faqs.org/docs/abs/HTML/io-redirection.html Về cơ bản tôi nhắc cho các lĩnh vực đầu tiên từ/dev/tty và sau đó đọc stdin, sử dụng mẹo lừa đảo và đóng:

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

Cảm ơn!

2

Vì có thể bạn có một số lượng ảnh khác nhau, tại sao không chỉ nhắc các trường đã biết trước và sau đó đọc 'mọi thứ khác'. Nó là dễ dàng hơn nhiều so với cố gắng để có được hai lĩnh vực cuối cùng của một chiều dài không rõ trong một cách tương tác.

+0

Lý do không hiệu quả đối với tôi là tôi đang cố gắng sử dụng đường ống để chuyển danh sách ảnh. Nếu tôi chỉ đọc những trường đó trước danh sách, hai bức ảnh đầu tiên trong danh sách sẽ trở thành chủ đề và nội dung email, đó không phải là những gì tôi muốn. (Tất nhiên, tôi có thể ra lệnh rằng chủ thể và cơ thể phải được thông qua trong hai dòng đầu tiên của đường ống đầu vào, nhưng điều đó quá xấu đối với tôi.) – alvherre

3

Bạn sẽ có thể sử dụng read để nhắc cho các đối tượng và cơ thể:

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

read -rp "Enter message subject" subject 

read -rp "Enter message body" body 
+0

Cảm ơn. Điều đó hoạt động nếu tôi nhập dữ liệu tương tác. Tuy nhiên, nếu tôi sử dụng một đường ống (đó là những gì tôi thực sự quan tâm), nó không. Ví dụ: Tôi đang cố gắng thực hiện việc này: cat/tmp/somephotoids | sed -e 's /\(.*\)/ DSC_ \ 1.jpg /' | sendpics.sh Trong khi tôi có thể giải quyết vấn đề bằng cách cắt giảm, tôi đã dành đủ thời gian để thực hiện nó theo cách này mà bây giờ tôi coi đó là một thách thức. – alvherre

Các vấn đề liên quan