2014-03-13 3 views
1

내가 사용자 입력을 얻기 위해 while 루프 내부에 읽기 명령을 실행하려고 작동하지 않는 동안 아래와 같이 내부 -u 3 읽기 :배쉬 -

for dir in ./*; do 
    for subdir in $dir/*; do 
     someprocess | 
     sort_processed_pipedout | 
     tail_sortedout | 
     while read line; do 
      another_process on $line 
      read -t 1 -n 10000 discard 
      read -u 3 -p "Save as final? (y/n)" USER_INPUT 
      if [ "$USER_INPUT" = y ]; then 
           something_else 
       echo "success" 
      fi 
     done 3<&0 
    done 
done 

이것은 내가 뭐하는 거지 무슨 생각을 :

첫 번째 읽기는 부주의 한 입력을 무시하고 두 번째 읽기는 'here'과 같이 '파일 핸들'을 0에서 3으로 전환하고 나머지는 평소와 같이 진행됩니다.

다음과 같은 현상이 발생합니다. USER_INPUT은 꼬리 출력에서 ​​직접 온 것 같습니다.

왜 이것이 실패합니까?

편집 : 동일한 하위 셸로 출력하려면 어떻게해야합니까?

+0

당신이 배관다시피, 프로세스는 서로 다른 서브 쉘에 속한다. – fedorqui

답변

3

BashFAQ #24을 참조하십시오. stdin을 리디렉션하려면 파이프 라인의 출력을 가리키는 것이 아니라 터미널을 계속 가리키는 동안 이전에 수행해야합니다. 더 나은 수행하는 전혀하지만, 단지 별도의 FD에 파이프 라인, 그렇지 않으면 무엇을 넣어 :

for subdir in ./*/*; do 
    while read -r -u 3 line; do 
     : another_process on "$line" 
     read -t 1 -n 10000 discard 
     read -p "Save as final? (y/n)" user_input 
     if [[ $user_input = y ]]; then 
      : something_else 
      echo "success" 
     fi 
    done 3< <(someprocess | sort_processed_pipeout | tail_sortedout) 
done 
+0

감사합니다. 나는/dev/tty에 출력/입력을 지시하여 스크립트를 해킹 할 수있었습니다./dev/tty가 안전하다면 (r) 강제로 실행하면 추측 할만큼 충분히 알지 못하기 때문에 더 나은 해결책 인 것 같습니다. – Golam

+0

/dev/tty에 액세스 할 수 있다면 안전 접근 방식이 좋습니다. 그것은 항상 거기에 있지 않습니다. 이 접근법이하는 또 다른 방법은 while 루프가 종료되고 while 루프가 종료 될 때 던져지지 않는 while 루프 내부에서 셸의 상태 (변수 설정, CD 실행 등)를 변경하여 exit, 나머지 파이프 라인을 서브 쉘에 넣고 루프 자체는 외부 쉘에 남겨 둡니다. –

1

0현재 표준 입력, 반드시 단자를 나타낸다는 여전히 단지를 복사 할 수 있도록, tail에서 파일 설명자로 파이프 3. 리다이렉션을 다음 루프로 이동하십시오.

for dir in ./*; do 
    for subdir in $dir/*; do 
     someprocess | 
     sort_processed_pipedout | 
     tail_sortedout | 
     while read line; do 
      another_process on $line 
      read -t 1 -n 10000 discard 
      read -u 3 -p "Save as final? (y/n)" USER_INPUT 
      if [ "$USER_INPUT" = y ]; then 
           something_else 
       echo "success" 
      fi 
     done 
    done 3<&0 
done 

가 (찰스 더피의 대답은 좀 더 좋은 개선이있다, 그래서 내가 대신 최소한의 수정이와 함께 갈 것입니다.)