linux + tput: $TERM에 값이 없고 -T가 지정되지 않았습니다.

linux + tput: $TERM에 값이 없고 -T가 지정되지 않았습니다.

bash 스크립트에서 tput 명령을 사용하여 텍스트 색상을 지정하고 있습니다.

~처럼

tput setaf 2

퍼티나 콘솔에서 스크립트를 실행하면 모든 것이 잘 작동합니다.

그러나 SSH를 통해 스크립트를 실행하는 일부 외부 WIN 애플리케이션 엔진을 실행하면 tput에서 다음 오류가 발생합니다.

tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified

tput 명령을 사용하기 위해 bash 스크립트에서 설정해야 할 사항(ENV 또는 기타)을 제안해 주세요.

답변1

연결할 때 ssh환경 변수가 원격 애플리케이션에 전달될 수도 있고 전달되지 않을 수도 있습니다 . 또한"WIN 애플리케이션 엔진"TERM설정이 전혀 없을 가능성이 높습니다 .

그렇다면 (또는 해당 문제 TERM에 대해서는) 동일한 효과가 있습니다.puttyxterm

tput setaf 2
tput -T putty setaf 2

사용되는 제어 순서가 setaf동일하기 때문입니다. 다시 말하지만, 이것들은 TERM다음과 linux같습니다 .

tput setaf 2
tput -T linux setaf 2

setaf전경(텍스트)을 특정 값으로 설정하는 데 사용됩니다.미국 국립표준협회(x3.64) 이스케이프 시퀀스. 여러분이 사용하는 대부분의 터미널은 이 작업을 수행합니다. 또는 일부는 이러한 이스케이프 시퀀스를 인식하지 못합니다. 언급된 응용 프로그램이 없으므로 실험을 통해 이것이 작동하는지 확인해야 합니다."WIN 애플리케이션 엔진"해당 이스케이프 시퀀스를 식별하십시오. 그렇다면 동일한 내용을 사용할 수 있습니다.미국 국립표준협회탈출해서 할 수 있어

tput -T xterm setaf 2

(물론 퍼티, 리눅스, xterm 사이에는 다른 차이점도 있습니다.)

답변2

여기에는 몇 가지 가능한 옵션이 있습니다.

  1. tput대화형 터미널 세션이 없으면 사용하지 마십시오. 다음 방법 중 하나를 선택할 수 있습니다.

    [[ -t 1 ]] && tput setaf 2 ...          # Only set a colour if we have a tty
    
    [[ -n "$TERM" ]] && tput setaf 2 ...    # Only set a colour if we have a terminal type definition
    
  2. 가상 터미널 유형을 설정합니다. / 의 대부분의 기능을 export TERM=dumb비활성화 할 수 있습니다 . 물론 아직 터미널 유형을 설정하지 않은 경우에만 이 작업을 수행하면 됩니다.terminfotermcap

    [[ -z "$TERM" ]] && export TERM=dumb    # Set a dummy terminal type if none set
    
    [[ ! -t 1 ]] && export TERM=dumb        # Set a dummy terminal type unless a tty
    

    이 접근 방식을 사용하면 후속 코드를 변경할 필요가 없으며 애플리케이션을 실행하기 전에 설정할 수도 있으며 차이점을 알 필요도 없습니다.

답변3

tty 명령을 사용하여 스크립트가 터미널에서 실행되는지 아니면 원격으로 실행되는지 확인합니다.

if tty -s
then 
    # executed only if in a terminal
    tput setaf 2 
fi

SSH 세션에서 명령을 지정하면 then및 사이의 명령은 실행되지 않습니다.fi

답변4

이것은 tput 문제에 대한 나의 해결책입니다.

# when $TERM is empty (non-interactive shell), then expand tput with '-T xterm-256color'
[[ ${TERM}=="" ]] && TPUTTERM='-T xterm-256color' \
                  || TPUTTERM=''

declare -r    RES='tput${TPUTTERM} sgr0'       REV='tput${TPUTTERM} rev'
declare -r    fRD='tput${TPUTTERM} setaf 1'    bRD='tput${TPUTTERM} setab 1'
declare -r    fGN='tput${TPUTTERM} setaf 2'    bGN='tput${TPUTTERM} setab 2'
...
echo ${fRD}" RED Message: ${REV} This message is RED REVERSE. "${RES}
echo ${fGN}" GREEN Message: ${REV} This message is GREEN REVERSE. "${RES}
...

이렇게 하면 대화형 쉘인지 비대화형 쉘인지는 중요하지 않습니다. tput은 여전히 ​​잘 작동합니다.

관련 정보