일부 프로그램은 서브루틴의 TTY 색상을 올바르게 전달하는 반면 다른 프로그램은 그렇지 않은 이유는 무엇입니까?

일부 프로그램은 서브루틴의 TTY 색상을 올바르게 전달하는 반면 다른 프로그램은 그렇지 않은 이유는 무엇입니까?

다음을 수행하여 tty를 색칠할 수 있습니다.

myscript.sh:

#!/bin/bash
echo -e "This is \033[0;31mRED\033[0m"

일반적으로 다른 "상위" 프로그램이 myscript.sh하위 프로세스로 실행 중인 경우 색상 코드가 올바르게 다시 전달되고 상위 프로그램을 실행하는 셸은 하위 프로세스의 색상을 표시합니다.

여러 번 작동하지 않습니다. GNU Make는 반례입니다

파일 생성:

foo:
    ./myscript.sh

내가 실행하면 make foo출력은 다음과 같습니다

This is \033[0;31mRED\033[0m

어떤 이유로 make하위 프로세스의 출력을 이스케이프해야 하는 것처럼 느껴집니다.

make누구든지 그것을 작성한 사람이 안티 기능을 생성하려면 코드(추가 작업)를 추가해야 하기 때문에 이것이 놀라운 일이라고 생각합니다 . 아니면 애플리케이션이 maketty의 스위치를 켜서 모든 것이 자동으로 이스케이프되도록 합니까? 그렇다면 이 동작을 무시하고 프로그램이 make하위 프로세스 데이터를 변환하지 않고 tty에 전달하도록 강제할 수 있습니까? 아니면 각 프로그램이 자체 방식으로 이 동작을 제어합니까?

답변1

문제는 스크립트가 POSIX가 아닌 것에 의존한다는 것입니다.bash기능하지만make사용 중/bin/sh셸의 경우(예: Debian) 다음과 같은 다른 프로그램일 수 있습니다.dash(POSIX 표준을 더 준수하는 쉘)

추가 자료:

답변2

Thomas가 답변에서 언급했듯이 사용된 셸은 make스크립트를 수동으로 실행할 때 사용하는 셸과 다릅니다.

일반적으로 스크립트에서 특정 쉘에 특정한 기능을 사용하는 경우 해당 특정 쉘을 shebang 줄에 배치해야 합니다.

예를 들어:

#!/bin/bash
echo -e "This is \033[0;31mRED\033[0m"

답변3

호출된 스크립트는 내장 파일 시스템이 아닌 make파일 시스템을 사용해야 합니다 .echo

/bin/echo -e "\033...

관련 정보