PS1과 같은 변수에서는 \033 이스케이프가 작동하지만 \x1b에서는 작동하지 않는 이유는 무엇입니까?

PS1과 같은 변수에서는 \033 이스케이프가 작동하지만 \x1b에서는 작동하지 않는 이유는 무엇입니까?

echo내장 문서 에 따르면 printf, \033및 는 \x1b모두 동일한 ASCII 제어 코드( Esc, 십진수 27)로 변환되어야 합니다.

간단한 명령 \x1b과 동일하게 작동 하지만 프롬프트 변수(예 : Why?) 에서는 서로 바꿔서 사용할 수 없습니다 .\033echo -ePS1

답변1

Bash에는 이를 해석할 수 있는 조항이 없기 때문입니다. 그림에서 알 수 있듯이힌트매뉴얼 페이지의 섹션에서는 bash(1)임의의 문자에 대해 8진수 이스케이프만 허용됩니다.

에 관해서는이 누락이 존재하며 POSIX sh와의 호환성을 위한 것이라고 추측할 수 있지만 Bash FAQ 버전 4.12에서도 아직 이 주제를 다루지 않기 때문에 Chet Ramey에게 직접 문의해야 합니다.

답변2

재 껍질:

\x1bBusybox v1.33.1로 컴파일된 ASH Shell이 ​​이를 올바르게 해석하는 것을 확인할 수 있습니다 .

Ignacio Vazquez-Abrams의 답변에 추가하기 위해 BASH가 여전히 일반적인 "인쇄" 유틸리티를 사용하여 16진수 이스케이프 패턴을 인쇄하는 이유는 이러한 항목을 처리하기 위해 인코딩되었기 때문입니다. 각 실행 파일에 대한 다음 매뉴얼 페이지 발췌를 참조하십시오.

echo -e '\x61'

-e     enable interpretation of backslash escapes
\xHH   byte with hexadecimal value HH (1 to 2 digits)

printf '\x61\n'

\xHH   byte with hexadecimal value HH (1 to 2 digits)

bash방금

\e
  An escape character.
\nnn
  The character whose ASCII code is the octal value nnn.

추신.:

  • 방금 아이패드로 사용해봤는데iSH 앱/bin/ash -> /bin/busybox, 기본 쉘로 실행됩니다.

관련 정보