Запуская macosx 10.6.2, я наблюдаю очень странное поведение сценария, который неоднократно вызывает curl -o (file), а затем выполняет поиск определенной строки внутри него. Иногда grep возвращает 1 (не найдено), когда я ожидал 0 (найдено). Вот сценарий ...
# do this 1000 times
for ii in `cat count.txt`; do
rm -f a.txt
rm -f e.txt
curl --fail --stderr e.txt -j -o a.txt -s $MYURL
if [ -e a.txt ] ; then
# Occasionally a.txt doesn't finish writing on time
grep "login-url" a.txt >/dev/null
LASTERR=$?
echo $LASTERR is lasterr grep 1
if [ "$LASTERR" -ne "0" ] ; then
cp a.txt anomaly.txt
sleep 1
echo "Sleeping..."
fi
grep -q "login-url" a.txt >/dev/null
LASTERR=$?
echo $LASTERR is lasterr grep 2
if [ "$LASTERR" -ne "0" ] ; then
echo "Dying..."
exit 1
fi
# This is what I actually want to do
grep "login-url" a.txt >> out.txt
fi
done
Я вижу что-то вроде этого:
0 is lasterr 1
0 is lasterr 2
...
0 is lasterr 1
0 is lasterr 2
0 is lasterr 1
1 is lasterr 2
Другими словами, a.txt меняется (насколько может судить grep) между двумя grep!
Кто-нибудь еще видел подобное?
Я замечаю, что если я перехожу в режим сна 1 после вызова curl, проблема исчезает. Так есть ли проблема с повторным использованием одного и того же имени файла снова и снова, или curl возвращается до того, как он закончил запись, или ...?
Это не проблема кризиса из-за обходного пути «сна 1», но я нервничаю, потому что не понимаю поведения.
Вы можете попробовать сделать два grep
команды совпадают. Надо -q
а другой нет. Вероятно, это не проблема, но стоит устранить различия, чтобы сузить круг вопросов.
Ваш вывод не соответствует тому, что делает скрипт, поэтому мне интересно, работаете ли вы и смотрите ли на две разные версии. Я сам делал это несколько раз, вызывая большое замешательство, пока не понял, что происходит.
вы пробовали вывод отладки bash?
bash -x /path/to/script
Он будет выводить каждый шаг дословно.