쉘의 텍스트 색상을 변경하고 싶습니다. tput
올바른 이스케이프 코드를 얻는 데 사용할 수 있습니다 . 예를 들어,
echo "$(tput setaf 5)My text$(tput sgr0)"
출력물에는 My text
분홍빛이 도는 색조가 있습니다.
이는 Linux, macOS, FreeBSD, NetBSD 및 Solaris에서 잘 작동합니다. 그러나 OpenBSD 7.2에서는 다음 오류가 발생합니다.
tput: not enough arguments (3) for capability `setaf'
~에 따르면OpenBSD 문서tput
terminfo
, 속성은 또는 에서 정의되어야 합니다 termcap
. setaf
정의가 보이지 않습니다선적 서류 비치termcap
, 그래서 나는 tput
해석이 다음 setaf
과 같다고 가정합니다.선적 서류 비치terminfo
. 이 문서에 따르면:
Tektronix 유형 터미널에서 현재 전경색이나 배경색을 변경하려면 다음을 사용하십시오.세타프(ANSI 전경 설정) 및세트탭(ANSI 배경 설정) 또는세테프(전경 설정) 및설정값(배경 설정). 색상 번호라는 하나의 매개변수를 사용합니다.
이는 오류 메시지가 말하는 내용과 충돌합니다. 반면에 tput setaf 5 0 0
and를 사용하면 마지막 두 매개변수에 관계없이 전경색이 분홍색으로 변경됩니다.
OpenBSD에 세 개의 매개변수가 필요한 이유는 무엇 tput
이며, 이 두 개의 추가 매개변수는 무엇을 의미합니까?
답변1
내가 기억할 수 있는 한 tput
(20년? 어쩌면 그 이상) 다양한 UNIX 유형 시스템에서 사용된 표준 기대치는 다음과 같습니다.
tput setaf
사용할 ANSI 색상 번호를 표시하려면 숫자가 필요합니다 .다른 것은 아마도 실수일 것입니다.tput sgr0
매개변수가 필요하지 않습니다.- 체인으로 연결할 수 있지만(
tput setaf 5 sgr0
), 이 특정 구성은 즉시 재설정되는 색상 변경을 내보내므로 의미가 없습니다.
tput setaf
귀하의 경우에는 여러 개의 숫자가 필요함을 반복합니다.버그일 수도 있습니다.
tput setaf 5 0 0
내 Debian 기반 시스템(bullseye)에서는 이것이 허용되고 예상치 못한 후행 값이 무시되므로(오류 없음) 다른 시스템을 손상시키지 않고 OpenBSD 오류를 충족할 수 있음을 발견했습니다 . (다른 명령에도 동일하게 적용됩니다 tput
. 추가 후행 인수가 허용되지만 무시됩니다.) 그러나 이것이 항상 그런 것은 아닌 경우 다음과 같은 코드가 적합하지만 필요한 해결 방법을 제공할 수 있습니다.
# Work around OpenBSD bug https://gitlab.com/jschx/ufetch/-/merge_requests/61
tputbug=; tput setaf 0 >/dev/null 2>&1 || tputbug='0 0'
tput setaf 2 $tputbug
그런데, 많은 색상 코드를 사용하려는 경우 명령 실행이 한 줄에 한 번이 아닌 각 색상에 대해 한 번씩 실행되도록 변수에 캡처하는 것이 좋습니다.
magenta=$(tput setaf 5 $tputbug)
normal=$(tput sgr0)
echo "${magenta}My text${normal}"
다른 독자를 위한 참고 사항: 변수에는 일반적으로 중괄호가 필요하지 않지만( $magenta
완전히 허용됨) 이 경우 바로 뒤에 오는 텍스트에서 변수 이름을 구분하는 데 사용됩니다. 그렇지 않으면 이름이 설정되지 않은 변수가 됩니다 $magentaMy
.
답변2
Thomas Dickie가 쓴 것처럼 "그의 의견tput
이 문제의 경우 필요한 인수 수를 잘못 계산하는 알려진 버그입니다 .이미 OpenBSD에 보고되었습니다.;이것은 추가적으로OpenBSD와 관련된 몇 가지 다른 문제tput
이것은 기본적으로 OpenBSD의 결과입니다.tput
이미 구식.
이 오류는 다른 사람들에 의해 여러 번 발생한 것 같습니다([1] [2] [삼] [4] [5]). 분명히 올바른 해결책은 OpenBSD에서 이 버그를 수정하는 것이지만 어떻게 해야 할지 모르겠습니다.
세 가지 가능한 해결책이 있습니다.
- 스튜어트 헨더슨OpenBSD 메일링 리스트에서 추천됨
tput setaf 5 0 0
마지막 두 매개변수가 false인 경우 해결 방법 으로 사용됩니다 . 이는 OpenBSD에서는 잘 작동하지만 다른 시스템에서는 오류가 발생하므로 OpenBSD를 감지하고 호출을 동적으로 변경해야 합니다tput
. TERM=xterm
OpenBSD가 실행 중인 것으로 감지되면 설정됩니다. 단점은 OpenBSD 사용자가 8가지 색상만 사용할 수 있다는 것입니다.- 오류가 반환되는지 확인하고
tput setaf 5
오류에 따라 호출 방법을 변경하십시오.tput
나로서는 문제를 해결하거나 해결하려고 에너지를 낭비하지 않을 것입니다. 사용자에게 이 문제가 발생하면 프로그램의 색상 기능을 비활성화하거나 OpenBSD에서 오류 보고를 복원하거나 OpenBSD 자체에서 오류를 수정하는 옵션이 있습니다.