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)。

関連情報