Bash добавляет \r к каждой строке

Bash добавляет \r к каждой строке

Я пытаюсь создать простой скрипт Linux BASH, но обратите внимание, что bash добавляет \r к каждой строке, и если я попытаюсь удалить его с помощью 'tr', то он просто добавит новый! Вот мой скрипт

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

и вот результат

 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

Почему появляется этот дополнительный \r? ] исчез, потому что он перезаписывается после новой строки. Я никогда раньше этого не видел...

решение1

Ваш скрипт — это текстовый файл DOS, то есть он содержит символ возврата каретки (часто пишется \r) в конце каждой строки. В текстовых файлах Unix этого нет, и когда система Unix выводит такой символ, это приводит к перемещению курсора в самое начало строки. Дальнейший вывод в эту строку перезапишет то, что было выведено там ранее.

Преобразование скрипта в текстовый файл Unix решит вашу проблему:

$ 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]

(в последней строке после вывода нет новой строки из-за использования echo -n).

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

(в последней строке после вывода нет новой строки из-за использования echo -n).

Связанный контент