Bash adicionando \r a cada string

Bash adicionando \r a cada string

Estou tentando criar um script Linux BASH simples, mas observe que o bash está adicionando \r a cada string, e se eu tentar removê-lo com 'tr', basta adicionar um novo! Aqui está meu roteiro

#!/bin/bash
OUTFILE=$(echo -n `date +"%Y-%m-%d_%H-%m-%S"`)
ASD='DDD'
echo -n "DATE [$OUTFILE]"
echo -n "DDD [$ASD]"

e aqui está a saída

 bash -x backup-datadir.sh
+++ date +%Y-%m-%d_%H-%m-%S
++ echo -n 2020-03-09_13-03-44
+ OUTFILE=$'2020-03-09_13-03-44\r'
+ ASD=$'DDD\r'
' echo -n 'DATE [2020-03-09_13-03-44
' echo -n 'DDD [DDD-03-44

Por que esse \r extra está aparecendo? O] desapareceu porque foi substituído após a nova linha. Eu nunca vi isso antes...

Responder1

Seu script é um arquivo de texto DOS, o que significa que contém um caractere de retorno de carro (geralmente escrito \r) no final de cada linha. Arquivos de texto Unix não possuem isso, e quando um sistema Unix está gerando tal caractere, faz com que a posição do cursor se mova para o início da linha. A saída adicional para essa linha substituirá o que foi gerado anteriormente lá.

Converter o script em um arquivo de texto Unix resolverá seu problema:

$ bash -x script.sh
+++ date +%Y-%m-%d_%H-%m-%S
++ echo -n 2020-03-09_21-03-47
+ OUTFILE=$'2020-03-09_21-03-47\r'
+ ASD=$'DDD\r'
' echo -n 'DATE [2020-03-09_21-03-47
' echo -n 'DDD [DDD-03-47
$ dos2unix script.sh
dos2unix: converting file script.sh to Unix format...
$ bash -x script.sh
+++ date +%Y-%m-%d_%H-%m-%S
++ echo -n 2020-03-09_21-03-03
+ OUTFILE=2020-03-09_21-03-03
+ ASD=DDD
+ echo -n 'DATE [2020-03-09_21-03-03]'
DATE [2020-03-09_21-03-03]+ echo -n 'DDD [DDD]'
DDD [DDD]

(não há nova linha após a saída na última linha devido ao uso echo -n).

$ bash script.sh
DATE [2020-03-09_21-03-19]DDD [DDD]

(não há nova linha após a saída na última linha devido ao uso echo -n).

informação relacionada