#!/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 -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
この文字は、行の最初の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