O padrão HTTP especifica que todas as linhas de cabeçalho, assim como a linha vazia que marca o fim dos cabeçalhos, devem usar os finais CRLF (retorno de carro, alimentação de linha). Muitos clientes são liberais e aceitam apenas o LF, mas a maioria dos servidores, incluindo o Google, respeita o padrão.
curl -I
exibe os cabeçalhos exatamente como enviados pelo servidor, incluindo os caracteres CR. No que diz respeito a um sistema unix, um caractere CR faz parte da linha, é apenas o caractere LF que finaliza a linha. A substituição de comandos remove caracteres LF à direita, mas não toca em caracteres LF. Portanto, o comando susbtitution $(curl -s -I https://google.com|grep Server)
retorna (no seu caso) a string Server: gws␍
(onde ␍
é um retorno de carro), e o comando echo "$(curl -s -I https://google.com|grep Server)" abc
exibe uma linha contendo
Server: gws␍abc
O caractere ␍
é uma instrução para o terminal mover o cursor para o início da linha, então os caracteres abc
sobrescrevem os três primeiros caracteres da linha.
Isso também explica por que o rastreamento de bash -x
é um pouco confuso.
O comando echo abc "$(curl -s -I https://google.com|grep Server)"
exibe uma linha contendo
Server: gwsabc␍
O caractere moves move o cursor para o começo da linha, então o avanço de linha move o cursor para o começo da próxima linha, então o ␍ não tem efeito visível.
Para evitar complicações devido ao CR, tire-as da entrada.
echo "$(curl -s -I https://google.com | tr -d '\r' | grep Server)" abc