다음 명령이 생성된 파일에 새 줄을 삽입하지 않는 이유는 무엇이며 해결 방법은 무엇입니까?
$ echo "Line 1\r\nLine2" >> readme.txt
$ cat readme.txt
Line 1\r\nLine2
답변1
-e 플래그를 echo에 전달하여 다음과 같이 "\r\n"과 같은 이스케이프 문자를 구문 분석하도록 합니다.
echo -e "Line 1\r\nLine2" >> readme.txt
답변2
echo
echo
이렇게 하면 단일 Unix 사양을 엄격하게 준수하는 구현에서 개행 문자가 추가됩니다.
echo 'line1\nline2'
그러나 이는 신뢰할 수 있는 동작이 아닙니다. 실제로는아니요기대할 수 있는 모든 표준 동작 echo
.
string
표준 출력에 기록될 문자열입니다. 첫 번째 피연산자가 이거나
-n
피연산자가 다음을 포함하는 경우\
<백슬래시>성격,결과는 구현에 따라 정의됩니다..존재하다XSI 표준 준수시스템에서 첫 번째 피연산자가 이면
-n
문자열로 처리되어야 합니다 .옵션이 아니다. 모든 인수에서 XSI 호환 시스템에서는 다음 문자 시퀀스가 인식됩니다.
\a
-를 쓰다<경고>.
\b
-를 쓰다<백스페이스 키>.
\c
- 억제<줄 바꿈>그렇지 않으면 출력의 마지막 인수를 따릅니다. 매개변수의 다음 문자는 모두\c
무시됩니다.
\f
-를 쓰다<페이지 변경>.
\n
-를 쓰다<줄 바꿈>.
\r
-를 쓰다<엔터>.
\t
-를 쓰다<탭>.
\v
-를 쓰다<세로탭>.
\\
-를 쓰다<백슬래시>특징.
\0num
- 0, 1, 2, 3자리의 8진수인 8비트 값을 씁니다.num
.
echo
따라서 일반적으로 그렇게 하는 것에 의존할 수 없다면 write newline을 사용하는 방법을 알 수 있는 일반적인 방법은 없습니다 echo
.
셸은 bash
일반적으로 다음을 수행합니다.아니요사양, 취급 및 기타 옵션을 준수 -n
하지만 그것조차 불확실합니다. 넌 할 수있어:
shopt -s xpg_echo
echo hey\\nthere
hey
there
그리고그것도 아니고빌드 타임 옵션을 사용하여 빌드한 경우 bash
이는 필요합니다 ...
기본적으로
echo
확장된 백슬래시 이스케이프 문자가 내장되어 있으므로 이-e
옵션은 필요하지 않습니다. 이는 기본값을 설정합니다.xpg_echo
주택 옵션on
, 이는 Bash가echo
단일 Unix 사양 버전 3에 지정된 버전과 더 유사하게 작동하도록 만듭니다. 보다Bash 내장 기능, 인식된 이스케이프 시퀀스에 대한 설명입니다echo
.
printf
반면에 printf
의 행동은 비교적 온화합니다.
이
printf
유틸리티는 이전에 에서 제공했던 서비스를 제공하기 위해 추가되었습니다echo
.화해할 수 없는 차이기존 버전 중에서 이 버전에는 9판 시스템의 하나를 기반으로 하는echo
이 새로운 유틸리티에 남아 있는 몇 가지 특수 기능이 있습니다 .printf
확장된 설명 부분이 거의 정확히 일치합니다.
printf()
파일 형식 표기법으로 설명되어 있지만 ISO C 표준의 기능XBD 파일 형식 표기.
%b
인수를 설명하는 형식 문자열을 처리합니다. 이는 여러 가지가 될 수 있지만 문자열의 경우 yte 문자열 또는 리터럴 문자열 과 거의 같습니다 %s
. %f
첫 번째 인수의 형식 지정 과는 %b
별도로 이스케이프를 처리하지 않는다는 점을 제외하면 yte 문자열 인수 와 가장 유사하게 작동합니다 \c
.
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
바라보다왜 printf
더 나은가요 echo
?더 알아보기.
echo() printf
예를 들어 자신만의 표준을 작성할 수 있습니다 echo
.
echo(){
printf '%b ' "$@\n\c"
}
...이것은 항상 자동으로 올바른 작업을 수행해야 합니다.
\n
사실, 아니요... 마지막 인수가 홀수로 끝나면 인수 끝에 리터럴을 인쇄합니다.<백슬래시>.
하지만 그렇지 않습니다:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
답변3
내가 사용한 모든 버전의 bash에서는 문자열이 완전히 인용된 경우 문자열에 대화형으로 또는 스크립트에 리터럴 개행 문자를 간단히 삽입할 수 있습니다.
인터렉티브:
$ echo "Line one
> Line two"
Line one
Line two
$
스크립트에서:
echo "Line one
Line two"
답변4
사람들은 적절한 답을 주었지만 나는 echo 가 echo 이외의 옵션을 허용하는 세상을 받아들이기를 거부합니다 -n
.
nl='
'
echo Line 1"$nl"Line 2"$nl"Line 3