运行 macosx 10.6.2,我看到一个脚本出现了一些极其奇怪的行为,该脚本反复调用 curl -o (file),然后 greps 中的某个字符串。当我期望 0(找到)时,grep 偶尔会返回 1(未找到)。这是脚本...
# 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 所知)!
有没有其他人见过类似的?
我注意到如果我在 curl 通话后进入“睡眠 1”,问题就会消失。那么一遍又一遍地重复使用相同的文件名是否存在问题,或者 curl 在完成写入之前返回,或者......?
由于“睡眠 1”解决方法,这不是危机问题,但我很紧张,因为我不理解这种行为。
您可以尝试使这两个
grep
命令匹配。一个有-q
,另一个没有。这可能不是问题,但值得消除差异以缩小范围。您的输出与脚本正在执行的操作不匹配,所以我想知道您是否正在运行并查看两个不同的版本。我自己也做过很多次,造成了很大的混乱,直到我意识到发生了什么。
你试过bash的调试输出吗?
它将逐字输出每个步骤。