运行 macosx 10.6.2 时,我发现一个脚本的行为非常奇怪,它反复调用 curl -o(文件),然后 grep 查找其中的某个字符串。有时 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 而言)!
还有谁见过类似的东西吗?
我注意到,如果我在 curl 调用后输入“sleep 1”,问题就会消失。那么,反复使用同一个文件名是否存在问题,还是 curl 在写入完成之前就返回了,或者......?
由于“睡眠 1”解决方法,这不是一个危机问题,但我很紧张,因为我不理解这种行为。
答案1
您可以尝试让两个grep
命令匹配。一个匹配-q
,另一个不匹配。这可能不是问题,但值得消除差异以缩小范围。
您的输出与脚本执行的操作不匹配,因此我怀疑您是否正在运行并查看两个不同的版本。我自己也做过很多次这样的事,这引起了很多混乱,直到我意识到发生了什么。
答案2
你尝试过 bash 的调试输出吗?
bash -x /path/to/script
它将逐字输出每个步骤。