printf와 echo -e는 다른 결과를 제공합니다.

printf와 echo -e는 다른 결과를 제공합니다.

나는 \0n이스케이프 시퀀스를 사용하고 echo -e여기서 printfn은 인쇄할 ASCII 문자의 8진수 값입니다. 해당 명령문을 사용할 때 echo -e "\0101"쉘은 문자를 인쇄 A하지만 쉘을 사용할 때 제공한 8진수의 최하위 비트를 printf "\0101"인쇄 하지만 처음에 이를 제거하고 명령을 사용 하면 예상대로 올바르게 인쇄됩니다 . 그래서 내 질문은 왜 이 특정 이스케이프 시퀀스가 ​​그렇게 큰 차이를 만드는지입니다. 다른 많은 이스케이프 시퀀스를 시도했지만 echo와 printf에 대해 동일한 결과를 제공합니다. 을 사용하고 있으며 현재 작업 중입니다 .10printf "\101"AUbuntubash

답변1

man echo1 부터 시작 :

\0NNN 8진수 값이 포함된 바이트 NNN(1~3자리)

man printf1 부터 시작 :

\NNN 8진수 값이 포함된 바이트 NNN(1~3자리)

이 두 명령은 동일한 8진수 시퀀스 형식을 허용하지 않습니다.

실제 출력이 크게 다른지 쉽게 확인할 수 있습니다.

$ echo -en "\0101" | od -A n -t o1
 101

echo실제로 예상되는 단일 문자를 인쇄합니다 A.

$ printf "\0101" | od -A n -t o1
 010 061

printf반면에 이를 \010문자 이스케이프 시퀀스로 처리하고 후속 문자를 1리터럴 문자로 처리하여 출력에만 복사합니다.
따라서 <backspace>8진수 표현을 사용하여 a(눈에 보이는 효과가 없고 문자열의 첫 번째 문자)를 인쇄하고 010그 뒤에 해석되지 않은 을 인쇄 합니다 1.


1 정확하게 말하자면, 실행 중인 명령은 설명된 명령 이 아닌 man(아마도 에서 나온 ) Bash 내장 명령일 가능성이 높습니다. coreutils그러나 둘 다 구문 을 help echo확인 하거나 직접 인용합니다.help printfman

관련 정보