Caracteres ímpares adicionados à string na substituição do comando

1

Estou escrevendo um script de shell com a seguinte construção:

    ...
server_addr="address"
run_user="user:password"
job_url=$(curl -X POST -u ${run_user} -s -i http://${server_addr}:8080/webportal/rest/v4/repository/users/BIRT/report_problem:jobs | grep Location | grep -o -E '[^ ]+$')
job_state=$(curl -X POST -u ${run_user} -H "Content-Type: application/json" -s -i ${job_url} | grep state |  grep -o -E '[^ ]+$')

A primeira variável job_url deve ser avaliada para uma URL que será usada no segundo comando. O problema está no URL resultante. Quando eu o executo diretamente no terminal, recebo um link normal:

http://address:8080/webportal/rest/v4/jobs/e0356d1c-ce69-489d-8f3c-40ae240cae6d

... mas, quando isso é usado em um script, ele falha. O modo de depuração bash mostra o problema:

++ curl -X POST -u user:password -s -i http://address:8080/webportal/rest/v4/repository/users/BIRT/report_problem:jobs
++ grep -o -E '[^ ]+$'
++ grep Location
+ job_url=$'http://address:8080/webportal/rest/v4/jobs/e0356d1c-ce69-489d-8f3c-40ae240cae6d\r'

Por algum motivo, o URL tem os símbolos regex: $'http://address:8080/webportal/rest/v4/jobs/e0356d1c-ce69-489d-8f3c-40ae240cae6d\r' e isso quebra toda a funcionalidade do script.

Qual é o motivo disso? Eu tentei mudar de citar em cURL, alternando entre awk e grep e verificando as opções do bash. Estou executando bash-4.1.2-41.el6_8.x86_64 no RHEL 6.

Qualquer ajuda apreciada!

    
por qugu 07.06.2017 / 22:14

1 resposta

1

Parece que o servidor que você está consultando está configurado para retornar finais de linha no estilo do Windows ( \r\n ) em vez do estilo "nix" * normal \n . Infelizmente, ao contrário de \n , \r não é retirado da saída do comando ao atribuir a uma variável. Para ilustrar:

$ var=$(printf 'hello\n')
$ printf  '%s' "$var" | od -c
0000000   h   e   l   l   o
0000005
$ var=$(printf 'hello\r\n')
$ printf  '%s' "$var" | od -c
0000000   h   e   l   l   o  \r
0000006

Como você pode ver, o \n é removido automaticamente, mas o \r não é. Então, se você não pode mudar a configuração do servidor, você só precisa remover o \r :

job_url=$(curl ... | grep Location | grep -o -E '[^ ]+$' | tr -d '\r')
    
por 07.06.2017 / 22:53