나는 Unix의 echo 명령에 대해 읽고 있었고 \
-e 옵션과 백슬래시( ) 이스케이프 문자에 대해 혼란스러워서 다음 두 가지 예를 실행했습니다.
echo "hello\\\\world"
산출:hello\\world
이제 -e를 사용하여 동일한 명령을 실행합니다.
echo -e "hello\\\\world"
산출:hello\world
그러면 옵션이 있거나 없는 백슬래시 문자의 의미는 무엇입니까 -e
?
인사
답변1
Bash 큰따옴표 문자열에서는 백슬래시를 사용하여 다음 문자가 리터럴로 처리되도록 할 수 있습니다. 즉, 입력 매개변수는 "a\\b"
다음을 통과합니다.리터럴 문자열 a\b
명령에. 이것으로부터 우리는 두 경우 모두 hello\\world
최종 인수로 전달하는 것이 에 echo
전달되기 전에 각 백슬래시 쌍이 단일 리터럴 백슬래시로 확장된다는 결론을 내릴 수 있습니다 echo
.
"다음 백슬래시 이스케이프 해석을 활성화"하도록 플래그를 지정합니다 -e
(자세한 내용 참조). 단일 백슬래시에 대한 이스케이프 시퀀스로 나열되므로 이 경우 Bash는 원래 문자열에 대해 동일한 작업을 수행하고 두 개의 백슬래시를 하나로 줄입니다. 이 플래그는 주로 수평 탭이나 개행 문자와 같은 이스케이프 시퀀스를 포함하는 데 사용됩니다. 예를 들어:echo
help echo
\\
echo
-e
\t
\n
$ echo -e 'first\tsecond\tthird'
first second third
대신 이것을 사용하는 것이 좋습니다 printf
. 첫째, 형식 문자열을 사용한다는 것은 사용자가 제공한 문자열을 이스케이프 시퀀스와 안전하게 혼합할 수 있음을 의미합니다.
$ printf '%s\t%s\t%s\n' 'inject\nescape' '\\' '\evil'
inject\nescape \\ \evil
둘째, 모든 버전이 echo
이를 지원하는 것은 아니며 실수로 인용되지 않은 변수를 사용하면 사람들이 동작을 -e
변경할 수 있습니다 .echo
$ injection='-e a\nb'
$ echo $injection
a
b
제삼:본 박사논문 수준의 분석.
그건 그렇고, Bash는 그렇습니다아니요작은따옴표로 묶인 문자열의 백슬래시를 이스케이프 문자로 처리하므로 다음과 같은 결과가 나타납니다.
$ echo 'hello\\\\world'
hello\\\\world
$ echo -e 'hello\\\\world'
hello\\world