Bash выход не выходит

Интересно, почему этот скрипт продолжает работать даже с явной командой выхода.

У меня есть два файла:

file1.txt со следующим содержанием:

 аааааа
BBBBBB
CCCCCC
DDDDDD
ээээээ
FFFFFF
GGGGGG

file2.txt со следующим содержанием:

 111111
аааааа
222222
333333
FFFFFF
444444

Сценарий (test.sh) это два вложенных цикла, проверяющих, содержит ли какая-либо строка первого файла какую-либо строку второго файла. Если он находит совпадение, он прерывается.

#!/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 

Я получаю следующий вывод, даже когда он должен выйти после печати первого !!!!!!!!!!:

 аааааа!!!!!!!!!!
BBBBBB
CCCCCC
DDDDDD
ээээээ
FFFFFF!!!!!!!!!!
GGGGGG

не exit должен закончить выполнение сценария в целом?

2 ответа

Решение

Причина в том, что трубы создают подпроцессы. Вместо этого используйте перенаправление ввода, и оно должно работать

#!/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

В общем случае, когда входные данные поступают из другой программы, а не из файла, вы можете использовать подстановку процесса

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)

Циклы while работают в своих оболочках. Выход из одной оболочки не завершает содержащие. $? может быть вашим другом здесь:

            ...
            echo "!!!!!!!!!!"
            exit 1
        fi
    done
    [ $? == 1 ] && exit 0;
done
Другие вопросы по тегам