在使用尾部时,管道卷曲后跟回声有时会截断输出

时间:2014-09-21 11:09:46

标签: bash curl echo

在bash脚本中给出以下两行,

LOCATION=$(curl -i -H "Windmill-Name: $APPLICATION_NAME" -H "Windmill-Identifier: $CFBundleIdentifier" -F "ipa=@$IPA" -F "plist=@$PLIST" $WINDMILL_BASE_URL/windmill/rest/windmill/$USER | grep ^Location | awk '{print $2}')
echo "[windmill] Use $LOCATION for accessing '$APPLICATION_NAME'"

在某些情况下, echo 字符串如下所示。

  

用于访问' MultiPartIOSDemo' [截断的$ LOCATION]

行为不一致但是当它再现时,格式错误的输出是一致的(即某个范围内的截断$ LOCATION)。

看起来echo将字符串输出到缓冲区,但卷曲的管道尚未完成,最终将其输出写在顶部。

无法说清楚。

更新

尝试了所有建议,但也出现了同样的问题。

现在已经删除了grep,脚本看起来像这样

LOCATION=$(curl -i -H "Windmill-Name: $APPLICATION_NAME" -H "Windmill-Identifier: $CFBundleIdentifier" -F "ipa=@$IPA" -F "plist=@$PLIST" "$WINDMILL_BASE_URL/windmill/rest/windmill/$USER" | awk -W '/^Location/ {print $2}')
echo "[windmill] Use $LOCATION for accessing '$APPLICATION_NAME'"

以下是一些更多细节。

包含上述行的脚本包含在

(
(
# bash script
) 2>&1 | tee $HOME/.windmill/$PROJECT_NAME.log

) 2>&1 | tee $HOME/.windmill/windmill.log

因此 echo 的输出在两个日志上。

注意到拖尾时出现上述行为,例如

tail -fn 20 ~/.windmill/windmill.log

但是,如果我做了

more ~/.windmill/windmill.log

我可以看到回显消息正确显示。注意换行符" ^ M"。想知道它是否与tail解析日志的方式有关。

  

[windmill]使用 [更正$ LOCATION] ^ M 访问' MultiPartIOSDemo'

澄清问题
经过以上所有猜测,确实有两个问题。

  1. 在什么情况下,^ M出现在日志中?
  2. 为什么尾部解析日志错误,即以这样的方式解析^ M:它首先输出"用于访问' MultiPartIOSDemo'"那么"使用$ LOCATION"在顶部。

2 个答案:

答案 0 :(得分:0)

我会(1)改变

$WINDMILL_BASE_URL/windmill/rest/windmill/$USER

"$WINDMILL_BASE_URL/windmill/rest/windmill/$USER"

(2)使用tee进行调试 (3)使用awk匹配“^ location”而不是grep

LOCATION=$(curl -i -H "Windmill-Name: $APPLICATION_NAME" -H "Windmill-Identifier: $CFBundleIdentifier" -F "ipa=@$IPA" -F "plist=@$PLIST" "$WINDMILL_BASE_URL/windmill/rest/windmill/$USER" | tee /tmp/debug.$$ | awk ' /^Location/ {print $2}')
echo "[windmill] Use $LOCATION for accessing '$APPLICATION_NAME'"

答案 1 :(得分:0)

也许curl会返回一个错误。您可以检查结果,只有在没有错误发生时才解析它

# Create a trace file
tfile=/tmp/trace.$$

# uncomment this line if you want to delete the trace file at the end of the script
#trap "/bin/rm $tfile" 0 1 15

curl -i -H "Windmill-Name: $APPLICATION_NAME" -H "Windmill-Identifier: $CFBundleIdentifier" -F "ipa=@$IPA" -F "plist=@$PLIST" "$WINDMILL_BASE_URL/windmill/rest/windmill/$USER" >$tfile
status=$?
if [ $status -eg 0 ]
then
    echo curl was successful
    LOCATION=$(awk '/^Location/ {print $2}' <$tfile)
    echo "[windmill] Use $LOCATION for accessing '$APPLICATION_NAME'"
else
    echo curl exited with status $status
fi