echo -e는 따옴표를 사용하지 않을 때 어떤 차이가 있습니까?

echo -e는 따옴표를 사용하지 않을 때 어떤 차이가 있습니까?

그렇다면 언제? 누구든지 이것을 설명할 수 있나요?

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'xx

그래서:

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>-eechoecho-e-E

관련 정보