그렇다면 언제? 누구든지 이것을 설명할 수 있나요?
echo -e \tr\t\e\\re\e
#eete
echo \tr\t\e\\re\e
#trte\ree
답변1
이는 쉘 echo
자체보다는 쉘이 명령을 구문 분석하는 방법과 더 관련이 있습니다. 첫 번째 예를 들어보세요.
echo -e \tr\t\e\\re\e
백슬래시는 따옴표 바깥에 나타나기 때문에 쉘은 이러한 백슬래시를 이스케이프 표시로 해석하여 백슬래시 뒤에 오는 문자의 (쉘에 대한) 특별한 의미를 제거합니다. 셸은 이 코드 줄을 세 단어 echo
, -e
및 로 구문 분석합니다 trte\ree
. 첫 번째 단어는 실행될 명령이 되고 다음 두 단어는 해당 인수가 됩니다. 구문 분석된 인수만 echo
표시됩니다. -e
이 옵션이 제공되기 때문에 echo
명령은 이스케이프를 평소와 같이 해석하지만 문자열 내에서는 trte\ree
쉘이 전달하는 문자열이기 때문입니다.
두 번째 인수를 작은따옴표로 묶으면 쉘이 \
문자를 해석하지 못하게 되어 그대로 전달할 수 있습니다 echo
. 그러므로:
echo -e '\tr\t\e\\re\e'
쉘은 echo
첫 번째 -e
와 두 번째 인수를 사용하여 호출됩니다 \tr\t\e\\re\e
. 이제 echo
모든 이스케이프 시퀀스를 해석해야 합니다.
답변2
\
예쉘의 참조 연산자. 마치 특별한 의미를 제거하는 것과 \x
같습니다 ( 개행 문자를 제거하는 것을 제외하고).'x'
x
x
그래서:
echo -e \tr\t\e\\re\e
처럼:
echo -e 't'r't''e''\'re'e'
t
, r
, e
은 쉘 구문에서 특별하지 않습니다. \
거기에 유일한 특별한 것. 따라서 본질적으로 이는 다음과 같습니다.
echo -e trte'\'ree
또는:
echo -e 'trte\ree'
귀하의 echo
구현은 ANSI C 이스케이프 시퀀스를 해석하도록 지시하는 옵션을 허용하는 구현 중 하나인 것으로 보이므로 캐리지 리턴으로 -e
변환됩니다. \r
이는 터미널로 전송될 때 커서를 다시 이동하도록 지시하는 제어 문자입니다. 선이 시작 부분에 있으므로 eete
( trte
부분적으로 덮여 있음 ee
) 표시되고 trte\ree
그렇지 않은 것을 볼 수 있습니다.
포함된 인수를 출력하도록 \tr\t\e\\re\e
전달 하려면 쉘이 이를 인용 연산자로 해석하지 않도록 백슬래시 문자를 인용/이스케이프해야 합니다.echo -e
<TAB>r<TAB><ESC>\e<ESC>
echo -e '\tr\t\e\\re\e'
echo -e \\tr\\t\\e\\\\re\\e
echo -e "\\tr\\t\\e\\\\re\\e" # (\ is still special within "..." to escape
# the few characters that are still special
# to the shell within double quotes)
echo -e $'\\tr\\t\\e\\\\re\\e' # (\ is not a quoting operator in $'...'
# but has its own special meaning there
# similar to that it has for echo)
아니면 이렇게 할 수도 있습니다:
echo $'\\tr\\t\\e\\\\re\\e'
이번에는 , 가 $'...'
각각 TAB, ESC, CR, \로 확장되어 포함된 인수를 받습니다. 그렇지 않은 경우에는 있는 그대로 표시됩니다(비록 모든 구현에 해당되는 것은 아니지만 많은 사람들이 이것을 다음과 같이 해석합니다. 기본값(일부는 비활성화될 수 있음)).\t
\e
\r
\\
echo
<TAB>r<TAB><ESC>\e<ESC>
-e
echo
echo
-e
-E