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 命令之前添加它就可以了。
怎麼了?我想不明白。
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 from
bash -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