【问题标题】:Piping curl followed by an echo some times truncates the output when using tail使用 tail 时,管道 curl 后跟 echo 有时会截断输出
【发布时间】:2014-09-21 11:09:45
【问题描述】:

鉴于 bash 脚本中的以下 2 行,

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 将字符串输出到缓冲区,但 curl 的管道尚未完成,最终将其输出写入顶部。

说不清楚。

更新

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

现在已经删除了 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”

澄清问题
综上所述,猜猜确实有2个问题。

  1. 什么情况下^M会出现在日志中?
  2. 为什么 tail 解析日志错误,即解析 ^M 的方式是先输出“用于访问 'MultiPartIOSDemo'”,然后在顶部输出“使用 $LOCATION”。

【问题讨论】:

  • 你在使用 Cygwin 吗?您可以使用 "tr '\015' '\012' " 将 ^m 更改为新行
  • 不使用 Cygwin。这是在 OS X 10.9.5

标签: bash curl echo


【解决方案1】:

我会(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'"

【讨论】:

  • 我看到了您的更改。 ^M 可能是个问题。我仍然建议您将 tee 放在 curl 和 awk 之间 - 这样您就可以看到 awk 的输入。通过使用
  • 我仍然建议您将 tee 放在 curl 和 awk 之间 - 这样您就可以看到 awk 的输入。通过使用“... | tee /tmp/trace.\ $$ | awk ...”,您可以捕获每个版本并将其存储在一个唯一的文件中($$ 扩展为进程 ID),以便您捕获每个版本的结果和每一个案例。
【解决方案2】:

也许 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多