명령이 `echo \\z` 출력을 \z로 표시하는 이유는 무엇입니까?

명령이 `echo \\z` 출력을 \z로 표시하는 이유는 무엇입니까?

이 명령은 echo $(echo \\\z)다음에서 비롯됩니다.이 책 , 왜 출력되는지 이해가 안 돼요

\지

출력하면 될 것 같아요

답변1

\쉘의 참조 연산자입니다. 다른 유형의 따옴표 밖에 있는 경우 ( 개행 문자가 아닌 경우) \x와 같습니다 .'x'x

그래서:

echo \\\x

처럼:

echo '\''x'

또는

echo '\x'

So는 echo두 개의 인수로 호출됩니다. 하나는 echo(이름)을 포함하고 다른 하나는 를 포함합니다 \x.

POSIX에 따르면echo, 피연산자(명령 이름 이외의 인수)에 백슬래시가 포함되어 있거나 첫 번째 피연산자가 -n지정되지 않은 경우 동작이 지정되지 않습니다. 그 밖에서도 행동이 다르다는 것을 알게 될 것입니다.

위 링크의 XSI를 적용하는 UNIX 사양에 따르면 표준 이스케이프 시퀀스 중 하나가 아니기 echo '\z'때문에 의 동작도 지정되지 않습니다 .\z

그러나 UNIX 호환 내장 함수 echo(예: ) 를 사용하면 다음을 보장할 수 있습니다.echobash -o posix -O xpg_echo

echo '\\z'

그것은 다음과 같습니다:

echo \\\\z

또는:

echo \\\\\z

출력됩니다 \z<newline>.

그 외에는 POSIX로부터 어떠한 보장도 받지 못합니다.

구현은 z또는 \z또는 no such escape sequence: \z또는 NUL 문자를 출력할 수 있습니다...

그러나 실제로 나는 \z이스케이프 시퀀스를 이해하는 구현을 인식하지 못하므로 내가 시도한 모든 구현이 거기에서 출력된다는 것을 발견했습니다 \z<newline>.

이식 가능하고 안정적인 텍스트 출력 방법을 원한다면,사용하지 말고 echo대신 printf사용하세요.

답변2

echo 문을 여러 부분으로 나눕니다.

\는 bash가 이스케이프로 인식하는 변수입니다.

따라서 \는 "\" 문자를 이스케이프 처리하므로 \가 인쇄됩니다.

\z는 문자 "z"를 이스케이프하므로 z가 인쇄됩니다.

종합하면, 우리는\z

관련 정보