bash를위한 컬러 출력 라이브러리를 작성하고 리디렉션을 사용하여 색상 및 스타일을 지정할 수있는 다양한 스타일 옵션을 작성하려고합니다.파이프에서의 Bash 테스트는 이상한 동작을 초래합니다.
echo "Red" | red
출력 빨간색 텍스트
및
echo "Bold" | bold
출력 굵은 텍스트
및
echo "Yellow bold" | yellow | bold
출력 굵은 노란색 텍스트
다음과 같이 내가 지금까지 쓴 것입니다 코드 :
#shellcheck shell=bash
# set debug
# set -o xtrace
# number of colors supported
__colors=$(tput colors 2> /dev/null)
# colors
__black="$(tput setaf 0)"
__red="$(tput setaf 1)"
__green="$(tput setaf 2)"
__yellow="$(tput setaf 3)"
__blue="$(tput setaf 4)"
__magenta="$(tput setaf 5)"
__cyan="$(tput setaf 6)"
__white="$(tput setaf 7)"
# style
__default="$(tput sgr0)"
__bold="$(tput bold)"
__underline="$(tput smul)"
function has_colors() {
COLOR=${COLOR:-auto}
if [[ $COLOR = 'never' ]]; then
return 1
elif [[ $COLOR = 'always' ]]; then
return 0
else
# check if stoud is terminal and terminal supports colors
[[ -t 1 ]] && \
[[ -n $__colors ]] && \
[[ $__colors -ge 8 ]]
fi
}
function __style() {
read -r input
if has_colors; then
echo -e "$1" "$input" "$__default"
else
echo -e "$input"
fi
}
function black() {
__style "$__black"
}
function red() {
__style "$__red"
}
function green() {
__style "$__green"
}
function yellow() {
__style "$__yellow"
}
function blue() {
__style "$__blue"
}
function magenta() {
__style "$__magenta"
}
function cyan() {
__style "$__cyan"
}
function white() {
__style "$__white"
}
function bold() {
__style "$__bold"
}
function underline() {
__style "$__underline"
}
설정 COLOR = 항상 항상 이스케이프 코드를 사용하여 출력합니다. 반면에 COLOR = auto는 현재 stdout이 터미널이고 터미널이 색상을 지원하는지 확인하기 위해 일부 검사를 수행합니다.
문제는 여러 스타일 옵션을 사용하면 작동하지 않는 것 같습니다. 마지막 스타일 옵션이 항상 적용됩니다. 예를 들면 다음과 같습니다.
echo "Yellow bold" | yellow | bold
은 굵은 텍스트를 출력하지만 노란색은 표시하지 않습니다. 한편
echo "Bold yellow" | bold | yellow
출력 노란색 텍스트하지만 굵게.
웃기는 건; COLOR 설정 = 항상 잘 작동하는 것 같습니다. 그래서 stdout이 terminal [[ -t 1 ]]
인지 확인하기 위해 수행하는 테스트와 같습니다. 나는 그 시험에 어떤 종류의 지체가 있기 때문에 그것이 맞는지 확신 할 수 없다. 하지만 [[ -t 1 ]]
비트를 제거하면 작동합니다.
어떻게하면 될까요? Bash 나 쉘이 어떻게 작동하는지에 대해서는 전문가가 아닙니다. 꽤 혼란스러워.
문제는 대신 배관 형식의 다음과 같은 첫 번째 매개 변수로 사용하여 다른 다음 형식 옵션 하나씩는 마지막 코드는
echo "Hello" | yellow bold underline
은 다음 트릭을 수행 굵은 글씨 ','황색 '의 표준 출력은 tty가 아닙니다. 각 색상 기능을 검사하는 대신 주 스크립트를 한 번 확인하고 모든 기능에서 다른 사람 ( –
@)을 사용하는 변수를 설정해야합니다. 그 이유는 바로 그 이유입니다. 한 번 확인하고 출력을 파일로 리디렉션하면 색상 이스케이프 코드가 표시됩니다. 어느 쪽이 좋을지 모르겠다 – Bren
set -xv 출력을 보면, 굵은 글씨 (두 번째라고 가정)가 스타일 내에서 echo -e 줄보다 먼저 호출되고 원래 문자열의 사본을 받는다는 사실에서 나온 것처럼 보입니다 따라서 당신은 inbetween와 같은 많은 변화를 할 수 있으며 결과는 항상 표준 텍스트로 볼드체가됩니다. 어떻게 든 각 파이프가 차례대로 데이터를 수신하도록해야합니다 (가장 좋은 방법은 확실하지 않음). wait 명령을 살펴볼 수 있습니까 ?? – grail