echo text após o comando curl na mesma linha

2
#!/bin/bash
echo "$(curl -s -I https://google.com|grep Server)" abc

retorna:

abcer: gws

e bash -x mostram:

++ grep Server
++ curl -s -I https://google.com
' abco 'Server: gws
 abcer: gws

mas

echo abc "$(curl -s -I https://google.com|grep Server)"' 

retorna

abc Server: gws

Em outras palavras, se eu adicionar texto APÓS o comando curl, ele será desconfigurado, mas tudo bem se eu adicioná-lo antes do curl.
O que está acontecendo? Eu não consigo descobrir.

    
por w00t 12.07.2015 / 05:21

3 respostas

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

mostra que o valor retornado por curl tem um ^ M (um retorno de carro). Quando você imprime a saída da curva, o retorno de carro leva o 'cursor' de volta ao início da linha, onde então imprime o 'abc', sobrescrevendo 'Serv'.

Na sua segunda tentativa, o retorno de carro não tem efeito óbvio.

    
por 12.07.2015 / 06:46
1

Tente remover o retorno de carro:

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

Saída:

Server: GFE/2.0 abc
    
por 12.07.2015 / 12:07
1

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
    
por 20.07.2015 / 00:21