방금 맥으로 옮겼습니다. 에서 사용하고 있습니다 bash
. 스크립트 자체는 작동하지만 컬러 출력을 생성하도록 작성되어 손상되었습니다.
다음은 스크립트의 처음 두 줄입니다.
#!/bin/bash
echo -e -n "\e[0m\e[32mhks>>>\e[2m "
- 내 기대는 이것을 실행하면 밝은 녹색
zsh
출력이 생성될 것이라는 것입니다.hks>>>
- 그러나 생성된 출력은 다음과 같습니다.
matthiashuttar@mac hks % hks bla \e[0m\e[32mhks>>>\e[2m \e[91mfailed to resolve target\e[0m
명령문 을 zsh
있는 그대로 실행할 수 있고 올바른 녹색 출력이 생성되므로 이것이 문제가 되지 않는다는 것을 알고 있습니다 .echo
zsh
누군가 내가 놓친 점을 지적할 수 있습니까?
답변1
MacOS는 이전 버전의 bash(3.2.x)와 함께 제공되므로 다른 시스템에서 실행되는 bash 스크립트는 macOS에서 실행되지 않을 수 있습니다. macOS의 bash 버전 \e
은 echo
.
이는 bash 1.x부터 3.x까지의 버그인 것으로 보이며 4.0에서 수정되었습니다. 매뉴얼에는 \e
지원되는 이스케이프 시퀀스 중 하나로 나열되어 echo
있지만 help echo
둘 다 나열되어 \E
있고 지원되지 않습니다 \e
. (코드를 자세히 살펴봐도 알 수 없고 다르게 처리 \e
되지만 \E
실험에서는 그렇습니다.)
(불일치로 인한 버그가 있었을 것입니다. 하지만 \E
당시에는 지원 전용이 바람직한 동작이었다고 생각합니다. 아마도 비표준 확장이었고 쉘 서클에는 주로 명령줄 옵션에서 다음과 같은 습관이 있었기 때문일 것입니다. 소문자는 표준이었고 대문자는 비표준이거나 현대적인 추가이므로 설명서에 잘못 나열되어 있다는 오류가 있습니다 \e
.
printf
$'…'
백슬래시 이스케이프에는 다른 코드를 사용합니다. 이는 bash \e
3.2.x에서도 인식됩니다. 또는 모든 sh 스타일 쉘에서 작동하는 8진수 이스케이프 시퀀스를 사용할 수 있습니다.
따라서 다음 중 하나로 대체될 수 있습니다 echo -e -n '\e…'
.
echo -e -n '\033…'
(대부분의 sh 스타일 쉘에서 작동하지만 일부는 지원하지 않거나-e
옵션-n
으로)printf '\033…'
(어떤 값%
이든 두 배로 늘려야 합니다.%s
변수가 있으면 추가 인수가 사용됩니다.) (모든 sh 스타일 쉘에 적용됩니다)printf %b '\033…'
(모든 sh 스타일 쉘에 적용)printf '\e…'
(어떤 값%
이든 두 배로 늘려야 합니다.%s
변수가 있는 경우 추가 인수를 사용하세요.)printf %b '\e…'
echo -n $'\e…'
echo -n -e '\E…'