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