POSIX 표준에 관한 흥미로운 동영상을 YouTube에서 보았습니다.
결과를 아시는 분 계시냐고 묻는 강의의 일부입니다.
echo \\\\\\
Bash 및 sh(POSIX 표준?)
sh-3.2$ echo \\\\\\
\\
bash$ echo \\\\\\
\\\
그 영상을 다시 찾고 싶었는데 못 찾았어요.
어떻게 이런 일이 일어났는지 이해가 안 돼요.
답변1
조금 복잡해집니다. 실제로는 있습니다삼다양한 시나리오: 두 가지 POSIX 변형과 Bash의 기능.
첫째, 쉘은 사용자가 작성한 내용을 처리합니다. POSIX 쉘 언어 및 Bash,백슬래시 인용 지원, 어느
후속 문자의 리터럴 값을 유지합니다.
따라서 주어진 명령의 매개변수 중 하나를 나타냅니다 \\
.\
귀하의 예에는 echo \\\\\\
세 쌍의 백슬래시가 포함되어 있습니다. 쉘은 이러한 이스케이프를 해석하고 세 개의 백슬래시를 인수로 제공합니다 \\\
.echo
echo '\\\'
모든 경우에 echo
명령은 동일한 인수를 갖지만 다르게 해석합니다.
POSIX
선택적 POSIX 확장(XSI 또는 X/개방형 시스템 인터페이스)는 이제 광범위한 지원을 받고 있습니다. XSI 지원 없이 POSIX와 호환될 수 있는데, 이 경우에는 차이가 있습니다.
XSI와 함께,echo
매개변수 내에서 해석하려면 백슬래시 이스케이프가 필요합니다., 포함하다
\\ Write a <backslash> character.
XSI 없이, POSIX는 대신 다음과 같이 말합니다.
첫 번째 피연산자가 -n이거나 피연산자에 <backslash> 문자가 포함된 경우 결과는 구현에 따라 정의됩니다.
따라서 특정 결과가 지정되지 않습니다(또는 표시되는 두 버전이 모두 허용됨).
POSIX/XSI는 echo
첫 번째 백슬래시 쌍을 이스케이프 자체로 해석하여 \\
출력을 생성합니다.
불다
배쉬 내장echo
반면에 이스케이프 시퀀스는 -e
명시적으로 필요한 옵션을 제공하지 않는 한 해석되지 않습니다.
존재하다Bash의 POSIX 모드, 다양한 상황에서 활성화됩니다 sh
(아직도 똑같은 일을 하고 있어(이것은 "구현에 따라 정의된" 동작이 허용됩니다). xpg_echo
이 옵션 활성화를 사용 하거나 shopt -s xpg_echo
실행 bash
파일이 구성 옵션으로 빌드되면 --enable-xpg-echo-default
POSIX/XSI 동작이 발생합니다.
GNU coreutils도 echo
같은 일을 합니다.
이는 다음을 의미합니다.
- Bash에서는 쉘 수준 해석만 발생하고 세 개의 백슬래시가 출력됩니다.
- POSIX/XSI 환경에서는 백슬래시가 해석됩니다.두 배, 두 개의 백슬래시가 출력됩니다.
- 순수 POSIX 환경에서는 구현이 동작을 선택할 수 있습니다. 표시되는 출력 버전은 모두 허용됩니다.
- 를 사용하여 이스케이프 문자를 자동으로 해석하는 XSI 동작을 갖도록 Bash를 구성할 수 있지만
shopt -s xpg_echo
명시적인 요청 없이는 활성화되지 않습니다.