echo -e \e는 macOS에서 bash 스크립트의 이스케이프 정보를 인쇄하지 않습니다.

echo -e \e는 macOS에서 bash 스크립트의 이스케이프 정보를 인쇄하지 않습니다.

방금 맥으로 옮겼습니다. 에서 사용하고 있습니다 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있는 그대로 실행할 수 있고 올바른 녹색 출력이 생성되므로 이것이 문제가 되지 않는다는 것을 알고 있습니다 .echozsh

누군가 내가 놓친 점을 지적할 수 있습니까?

답변1

MacOS는 이전 버전의 bash(3.2.x)와 함께 제공되므로 다른 시스템에서 실행되는 bash 스크립트는 macOS에서 실행되지 않을 수 있습니다. macOS의 bash 버전 \eecho.

이는 bash 1.x부터 3.x까지의 버그인 것으로 보이며 4.0에서 수정되었습니다. 매뉴얼에는 \e지원되는 이스케이프 시퀀스 중 하나로 나열되어 echo있지만 help echo둘 다 나열되어 \E있고 지원되지 않습니다 \e. (코드를 자세히 살펴봐도 알 수 없고 다르게 처리 \e되지만 \E실험에서는 그렇습니다.)

(불일치로 인한 버그가 있었을 것입니다. 하지만 \E당시에는 지원 전용이 바람직한 동작이었다고 생각합니다. 아마도 비표준 확장이었고 쉘 서클에는 주로 명령줄 옵션에서 다음과 같은 습관이 있었기 때문일 것입니다. 소문자는 표준이었고 대문자는 비표준이거나 현대적인 추가이므로 설명서에 잘못 나열되어 있다는 오류가 있습니다 \e.

printf$'…'백슬래시 이스케이프에는 다른 코드를 사용합니다. 이는 bash \e3.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…'

관련 정보