Bash에서 echo/printf에 조건부로 이스케이프 코드를 삼키도록 지시하는 방법은 무엇입니까?

Bash에서 echo/printf에 조건부로 이스케이프 코드를 삼키도록 지시하는 방법은 무엇입니까?

작업으로 대화형으로 실행되는 Bash 스크립트가 있습니다 cron. 대화형으로 실행하면 터미널에 컬러 텍스트가 출력됩니다. 하지만 실행해보면 cron터미널이 없기 때문에 [1;31m출력에서도 비슷한 결과가 많이 나옵니다.

출력 장치가 이스케이프 코드를 지원하지 않는 경우 Bash가 이스케이프 코드를 삼키도록 지시하는 방법이 있습니까?

이는 다음과 관련이 있습니다.Bash가 색상을 인쇄할 수 있는지 확인하는 방법상태를 확인하는 것입니다. 다만, 출력장치에 따라 색상의 이중 기능을 유지 echo하거나 두 가지 모두를 유지하면서 호출할 때 printf가능한 한 적은 변경을 하고 싶습니다 .

답변1

터미널로 인쇄 중인지 확인하세요. ls이것이 GNU와 GNU와 같은 프로그램이 .grep--color=auto

터미널에 인쇄하는 경우에도 이론적으로는 색상 변경 이스케이프 시퀀스를 이해하지 못할 수 있습니다. 거의 모든 공통 및 최소 공통 터미널은 이러한 순서를 이해합니다. 내가 본 모든 X11 터미널 에뮬레이터, screen, tmux, Linux 콘솔, *BSD 콘솔, PuTTY, rxvt, Console2, ConEmu 등.

normal=
green=
if [ -t 1 ]; then
  normal=$'\e[0m'
  green=$'\e32m'
 fi
 echo "foobar ${green}OK${normal}"

테스트는 [ -t 1 ]표준 출력 및 [ -t 2 ]표준 오류에 대한 것입니다.

확장을 지원하지 않는 쉘에서는 $'…'다음을 사용하여 이식 가능한 이스케이프 문자를 생성할 수 있습니다.esc=$(echo _ | tr _ '\033')

답변2

정확히 꿀꺽꿀꺽 마시는 것은 아니지만 매개변수 확장을 통해 제거할 수 있습니다.

str='Hello \e[31mc\e[32mo\e[33ml\e[34mo\e[35mr\e[m world'

# colorful output
echo -e "$str"

# colorless output    
echo -e "${str//\\e\[+([0-9;])m}"

위의 경우 쉘 옵션을 켜야 bash합니다 . extglob( shopt -s extglob)

사용하기 쉽도록 함수를 정의하십시오.

function ecco() { [ -t 1 ] && echo -e "$1" || echo -e "${1//\\e\[+([0-9;])m}"; }

그런 다음 그냥 호출하면 됩니다.

ecco 'Hello \e[31mc\e[32mo\e[33ml\e[34mo\e[35mr\e[m world'

작동하는지 확인하려면 출력을 리디렉션하면 색상이 사라집니다.

ecco 'Hello \e[31mc\e[32mo\e[33ml\e[34mo\e[35mr\e[m world' | cat

답변3

대화형으로 실행되는 경우 스크립트를 체크인해야 합니까?

http://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html

인용 부호:

6.3.2 이 쉘은 대화형입니까?

시작 스크립트의 Bash가 대화형으로 실행되고 있는지 확인하려면 "-" 특수 매개변수의 값을 테스트하세요. 쉘이 대화형일 때 i가 포함됩니다. 예를 들어:

case "$-" in
  *i*)   echo This shell is interactive ;;
   *)    echo This shell is not interactive ;;
esac

또는 시작 스크립트에서 변수 PS1을 확인할 수 있습니다. 이 변수는 비대화형 셸에서 설정 해제되고 대화형 셸에서는 설정됩니다. 그러므로:

if [ -z "$PS1" ]; then
   echo This shell is not interactive
else
   echo This shell is interactive
fi

대화형인 경우 "_escape_codes_", 그렇지 않은 경우 ""로 변수 세트를 정의하고 이 변수를 사용하여 스크립트의 출력 색상을 지정합니다(대화형 환경에서는 이스케이프 코드가 있고, 비대화형 환경에서는 독립적으로 추가됩니다). 본문의).

전임자:

case "$-" in
  *i*)    _bold_="$(printf '\033[1m')"
          _norm_="$(printf '\033[0m')"
          ;;
  *)      _bold_=""
          _norm_=""
          ;;
esac
echo "this ${_bold_}text${_norm_} is important"

관련 정보