2010-01-02 3 views
5

나는 행운을 들이지 않고 쉘 스크립트에서 여러 번 stdin에서 읽으려고합니다. 먼저 stdin 파이프에서 읽은 파일 목록을 읽은 다음 두 번 더 읽어서 대화식으로 두 개의 문자열을 얻습니다. (내가하려는 것은 전자 메일, 제목 및 전자 메일 본문에 첨부 할 파일 목록을 읽는 것입니다.)bash에서 stdin을 여러 번 읽음

지금까지 나는이 있습니다

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

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

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

(플러스 오류가 나는 succintness을 위해 생략 코드 확인) 두 번째와 세 번째 리디렉션은 EOF를 얻을 수 있기 때문에

그러나, 이것은 아마도 빈 제목과 본문을 얻는다을 .

난 닫히고 다시 열려고 시도했습니다 < & - 그리고 그런 식으로 작동하지 않는 것 같습니다.

"while; read line"루프를 사용하여 파일 목록에 구분 기호를 사용하고 분리 기호가 감지되었을 때 루프에서 빠져 나오기까지했습니다. 그러나 그것도 (?) 작동하지 않았다.

아이디어를 어떻게 만드 는가?

답변

5

EZPZ의 대답이 문서를 기반으로하고/dev/tty를 입력 한 다음 dup-and-close 트릭을 사용하여 stdin을 읽습니다.

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

감사합니다!

2

다양한 사진이있을 수 있으므로 알려진 필드를 먼저 묻고 '그 외 모든 것을 읽으십시오.' 대화식 방식으로 알려지지 않은 길이의 마지막 두 필드를 가져 오는 것보다 훨씬 쉽습니다.

+0

나를 위해 작동하지 않는 이유는 파이프를 사용하여 사진 목록을 전달하려고하기 때문입니다. 목록 앞에있는 해당 필드를 단순히 읽으면 목록에있는 두 개의 첫 번째 사진이 제목과 이메일 본문이됩니다. 이는 내가 원하는 것이 아닙니다. (물론, 필자는 피사체와 몸체가 입력 파이프의 처음 두 줄에 전달되어야한다고 지시 할 수 있지만 그것은 나에게 너무 추악합니다.) – alvherre

3

당신은 제목과 본문에 대한 프롬프트를 read을 사용할 수 있어야합니다 : http://www.faqs.org/docs/abs/HTML/io-redirection.html은 기본적으로 내가에서 먼저 필드를 묻는 메시지 : 내가 결국 무엇 그래서

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

read -rp "Enter message subject" subject 

read -rp "Enter message body" body 
+0

감사합니다. 데이터를 대화식으로 입력하면 작동합니다. 그러나 파이프를 사용하면 실제로 관심이 있습니다. 예를 들어,이 작업을 수행하려고합니다. cat/tmp/somephotoids | sed -e 's /\(.*\)/ DSC_ \ 1.jpg /'| sendpics.sh cut'n'pasting에 의한 문제를 해결할 수있는 동안, 나는 지금 그것을 일종의 도전으로 생각할만큼 충분히 시간을 보냈습니다. – alvherre