2013-08-21 4 views
3

이 스크립트가 명시 적 exit 명령을 사용하여 계속 실행되는 이유가 궁금합니다. 다음과 같은 내용Bash 종료가 종료되지 않습니다.

aaaaaa 
bbbbbb 
cccccc 
dddddd 
eeeeee 
ffffff 
gggggg 

file2.txt :

file1.txt 다음과 같은 내용 :

111111 
aaaaaa 
222222 
333333 
ffffff 
444444 

스크립트 (test.sh)이이 두 개의 중첩 된 루프입니다

나는 두 개의 파일이 첫 번째 파일의 모든 행에 두 번째 파일의 행이 포함되어 있는지 확인합니다. 일치하는 항목이 있으면 중단됩니다.

aaaaaa 
!!!!!!!!!! 
bbbbbb 
cccccc 
dddddd 
eeeeee 
ffffff 
!!!!!!!!!! 
gggggg 

모두 스크립트의 실행을 종료 안 exit 수 있습니다 :

#!/bin/bash 
path=`dirname $0` 

cat $path/file1.txt | while read line 
do 
    echo $line 
    cat $RUTA/file2.txt | while read another 
    do 
     if [ ! -z "`echo $line | grep -i $another`" ]; then 
      echo "!!!!!!!!!!" 
      exit 0 
     fi    
    done 
done 

나는 그것이 첫 번째 !!!!!!!!!!를 인쇄 한 후 종료한다하더라도 다음과 같은 출력을 얻을?

+1

유일한 이유를 사용할 수 있습니다 파이프가 'while'으로 인해 생긴 것입니다. 파이프는'while'에 대해 다른 서브 프로세스 (셸)를 시작할 것이므로'while' 내의'exit'는 그 셸을 빠져 나갑니다. – lurker

답변

10

왜냐하면 파이프가 하위 프로세스를 생성하기 때문입니다. 대신 입력 리디렉션을 사용하고 입력이 파일에서 다른 프로그램에서하지 오는 일반적인 경우에서

#!/bin/bash 

while read -r line 
do 
    echo "$line" 
    while read -r another 
    do 
     if grep -i "$another" <<< "$line" ;then 
      echo "!!!!!!!!!!" 
      exit 0 
     fi 
    done < file2.txt 
done < file1.txt 

작동합니다, 당신은 내가 생각할 수있는 process substitution

while read -r line 
do 
    echo "$line" 
    while read -r another 
    do 
     if grep -i "$another" <<< "$line" ;then 
      echo "!!!!!!!!!!" 
      exit 0 
     fi 
    done < <(command2) 
done < <(command1) 
+0

감사합니다 ... 너무 커맨드의 출력을 비교해야하는 파일 대신에? 어떻게 입력 리디렉션을 사용할 수 있습니까? <<< 명령을 시도했지만 작동하지 않았습니다 ... 질문을 단순화하기 위해 file1 file2 예제를 사용했지만 실제로 두 명령의 출력을 비교하고 있습니다. –

+0

그런 다음 [프로세스 대체] (http://tldp.org/LDP/abs/html/process-sub.html)를 사용해야합니다. 예를 들면 :'read -r line; do # 명령; done <<(othercommand)' – user000001

+0

당신은 나를 날려 버렸습니다! Bash는 매우 관용적입니다. –

3

while 루프는 각 쉘에서 실행 중입니다. 하나의 쉘을 종료해도 포함 된 쉘은 종료되지 않습니다. $? 여기에 친구가 될 수 있습니다 :

  ... 
      echo "!!!!!!!!!!" 
      exit 1 
     fi 
    done 
    [ $? == 1 ] && exit 0; 
done 
관련 문제