当使用尾部时,管道卷曲后跟回波有时会截断输出
鉴于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个问题。
我会(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?