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

鉴于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'"

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

用于访问'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'"

这里有一些更多的细节。

包含上述行的脚本包装在a中

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

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

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

只是注意到上述行为发生在拖尾时 ,例如

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

但是,如果我做了

more ~/.windmill/windmill.log

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

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

澄清问题
以上所有猜测,真的有2个问题。

  • ^ M在什么情况下出现在日志中?
  • 为什么尾部解析日志错误,即解析^ M时首先输出“用于访问'MultiPartIOSDemo'”,然后输出顶部的“使用$ LOCATION”。

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

    也许卷曲正在回应一个错误。 您可以检查结果,只有在没有错误发生时才解析结果

    # 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
    
    链接地址: http://www.djcxy.com/p/42701.html

    上一篇: Piping curl followed by an echo some times truncates the output when using tail

    下一篇: How to write a bash script that takes optional input arguments?