在同一行上的curl命令后回显文本

在同一行上的curl命令后回显文本
#!/bin/bash
echo "$(curl -s -I https://google.com|grep Server)" abc

返回:

abcer: gws

bash -x显示:

++ grep Server
++ curl -s -I https://google.com
' abco 'Server: gws
 abcer: gws

echo abc "$(curl -s -I https://google.com|grep Server)"` 

回报

abc Server: gws

换句话说,如果我在curl命令之后添加文本,它会被破坏,但如果我在curl之前添加它就可以了。
怎么了?我想不明白。

答案1

HTTP 标准规定所有标头行以及标记标头结束的空行必须使用 CRLF(回车换行)结尾。许多客户端都是自由派,只接受 LF,但大多数服务器(包括 Google)都尊重该标准。

curl -I显示与服务器发送的完全相同的标头,包括 CR 字符。就 Unix 系统而言,CR 字符是行的一部分,只有 LF 字符才结束行。命令替换会删除尾随的 LF 字符,但不会触及 CR 字符。因此,命令替换$(curl -s -I https://google.com|grep Server)返回(在您的情况下)字符串Server: gws␍(其中是回车符),并且命令echo "$(curl -s -I https://google.com|grep Server)" abc显示包含

Server: gws␍abc

字符是向终端发出的将光标移动到行首的指令,因此该字符abc会覆盖该行的前三个字符。

这也解释了为什么trace frombash -x有点乱码。

该命令echo abc "$(curl -s -I https://google.com|grep Server)"显示一行包含

Server: gwsabc␍

␍字符将光标移动到行首,然后换行将光标移动到下一行的开头,因此␍没有可见的效果。

为了避免 CR 引起的复杂情况,请将它们从输入中剥离。

echo "$(curl -s -I https://google.com | tr -d '\r' | grep Server)" abc

答案2

echo $(curl -s -I https://google.com|grep Server)|cat -A

显示curl 返回的值有一个^M(回车符)。当您打印出curl的输出时,回车符将“光标”带回到行的开头,然后打印出“abc”,覆盖“Serv”。

在你的第二次尝试中,回车没有明显的效果。

答案3

尝试以下方法删除回车符:

 echo "$(curl -s -I https://google.com|grep Server)" abc | tr -d "\r"

输出:

服务器:GFE/2.0 abc

相关内容