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
에 대해서는) 동일한 효과가 있습니다.putty
xterm
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
여기에는 몇 가지 가능한 옵션이 있습니다.
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
가상 터미널 유형을 설정합니다. / 의 대부분의 기능을
export TERM=dumb
비활성화 할 수 있습니다 . 물론 아직 터미널 유형을 설정하지 않은 경우에만 이 작업을 수행하면 됩니다.terminfo
termcap
[[ -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은 여전히 잘 작동합니다.