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

\r귀하의 스크립트는 DOS 텍스트 파일입니다. 즉, 각 줄 끝에 캐리지 리턴 문자(보통 로 작성됨)가 포함되어 있습니다. 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).

관련 정보