Substituição de comando Bash e problema de variável

1

Estou escrevendo algum utilitário de backup simples no bash e qualquer saída deve estar em JSON.

Estou verificando a acessibilidade do host e, se ocorrer algum erro, quero imprimi-lo. No entanto, tenho um problema com a saída:

FAILED=1
TIME_STARTED=$(date +%s)
OUT="$( ${SSH} ${SSH_ARGS} ${HOST} 'true' 2>&1 >/dev/null)"

if [[ $? != 0 && ! -z "${OUT}" ]]; then

    TIME_ENDED=$(date +%s)
    JSON="{ \"time_started\": \"${TIME_STARTED}\", \"time_ended\": \"${TIME_ENDED}\", \"state\": ${FAILED}, \"error\": \"${OUT}\" }"
    echo "${JSON}"    
    exit ${TRUE}
fi

resulta em:

[root@internal ~]# ./backup -H 17.17.0.111
" }time_started": "1394889912", "time_ended": "1394889913", "state": 1, "error": "Permission denied (publickey,password,keyboard-interactive).
[root@internal]# 

Estou usando alguns utilitários CLI node.js para imprimir bastante o JSON para a saída final, mas ele falha porque fica com o JSON inválido do shell. Como devo corrigir isso?

P.S: Eu sei que há muitas bibliotecas para formatar o JSON, mas eu preciso fazer isso e gostaria de não discuti-lo aqui.

    
por user307615 15.03.2014 / 14:29

1 resposta

0

Parece-me que a saída ssh está captando um caractere de retorno de carro. Experimente:

JSON="{ \"time_started\": \"${TIME_STARTED}\", \"time_ended\": \"${TIME_ENDED}\", \"state\": ${FAILED}, \"error\": \"${OUT%$'\r'}\" }"

Explicação: Isto:

${OUT%$'\r'}

cortes de um caractere CR à direita, se houver um ...

    
por 15.03.2014 / 15:35