在 macosx 上重复 curl + grep 偶尔会产生糟糕的结果?

在 macosx 上重复 curl + grep 偶尔会产生糟糕的结果?

运行 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

它将逐字输出每个步骤。

相关内容