同じ行のカールコマンドの後のテキストエコー

同じ行のカールコマンドの後のテキストエコー
#!/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

つまり、カールコマンドの後にテキストを追加すると破損しますが、カールコマンドの前に追加してもかまいません。
何が問題なの?わかりません。

答え1

HTTP標準では、すべてのヘッダー行とヘッダーの終わりを示す空の行をCRLF(キャリッジリターン行折り返し)で終了する必要があると規定しています。多くのクライアントは自由主義的でLFのみを許可しますが、ほとんどのサーバー(Googleを含む)は標準を尊重します。

curl -ICR文字を含むサーバーから送信されたものとまったく同じヘッダーを表示します。 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

この文字は、行の最初の3文字を上書きするようにカーソルを行の先頭に移動するように端末コマンドです。abc

これはまた、Trace fromがbash -x少し歪んだ理由も説明します。

このコマンドは、echo abc "$(curl -s -I https://google.com|grep Server)"以下を含む行を表示します。

Server: gwsabc␍

␍文字はカーソルを行の先頭に移動し、改行文字はカーソルを次の行の先頭に移動するため、␍は目に見える効果はありません。

CRによる複雑さを避けるために、入力から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

カールが返した値にキャリッジリターン文字(^ M)があることを示します。カールの出力を印刷すると、キャリッジリターンは「カーソル」を行の先頭に戻し、「abc」を印刷して「Serv」を上書きします。

2回目の試みでは、キャリッジリターンが目立つ効果はありません。

答え3

キャリッジリターンを削除するには、以下を試してください。

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

出力:

サーバー: GFE/2.0 abc

関連情報