Curl

在同一行上的 curl 命令後回顯文本

  • November 1, 2021
#!/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 命令之前添加它就可以了。

怎麼了?我想不明白。

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

表明 curl 返回的值有一個 ^M(輸入)。當您列印出 curl 的輸出時,輸入將“游標”帶回行首,然後列印出“abc”,覆蓋“Serv”。

在您的第二次嘗試中,輸入沒有明顯效果。

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

引用自:https://unix.stackexchange.com/questions/217066