내 표준 입력을 녹색으로 표시하도록 zsh 구성

내 표준 입력을 녹색으로 표시하도록 zsh 구성

오류를 빨간색으로 표시하고 zsh에서 녹색으로 입력하는 간단한 방법을 원합니다. 내가 찾은이 응답, 훌륭하게 작동하지만 입력 색상을 구현하지 않습니다. 저는 실제로 유닉스 개발자가 아니기 때문에 몇 가지를 시도했지만 작동하지 않았습니다. 이 방법이나 유사한 방법을 사용하여 입력 색상을 녹색으로 어떻게 변경할 수 있습니까?

이것은 내 실제 내용입니다 .zshrc.

setcolor()
{
    case "$1" in
    red)
        tput setaf 1
        ;;
    normal)
        tput sgr0
        ;;
    green)
        tput setaf 2
        ;;
    esac
}

# make standard error red
rederr()
{
    while read -r line
    do
        setcolor $errorcolor
        echo "$line"
        setcolor normal
    done
}

errorcolor=red

errfifo=${TMPDIR:-/tmp}/errfifo.$$
mkfifo $errfifo
# to silence the line telling us what job number the background job is
exec 2>/dev/null
rederr <$errfifo&
errpid=$!
disown %+
exec 2>$errfifo

답변1

표준 입력은입력하다흐름, 거기에는 색칠할 것이 없습니다. 초록색으로 칠하고 싶다는 뜻인 것 같아요에코터미널에 입력하는 내용은 커널의 터미널 장치 드라이버 또는 응용 프로그램 자체(자체 라인 편집기를 구현하는 경우)에 의해 수행됩니다.

터미널로의 출력이 stdout, stderr 또는 입력 에코(커널을 통해 또는 자체 줄 편집기를 구현하고 /dev/ttystdout/stderr를 사용하는 대신 에코되는 응용 프로그램을 열어)를 통해서만 수행될 수 있다는 것을 알고 있는 경우 색상을 지정할 수 있습니다. stdout/stderr 프로세서는 무언가를 출력한 후 색상을 녹색으로 변경합니다.녹색실제로 stdout이나 stderr을 통하지 않는 모든 출력의 기본 색상은 다음과 같습니다.

zmodload zsh/system
autoload colors; colors
colour-stream() {
  local buf output_colour=$fg[$1] after_colour=$fg[$2]
  while sysread buf; do
    syswrite -- $output_colour$buf$after_colour
  done > /dev/tty
}
exec 1> >(colour-stream default green) \
     2> >(colour-stream red     green)

$TTY터미널을 열거나 직접 써서 작성한 내용 /dev/tty(예: sudo비밀번호 프롬프트) echo test > /dev/tty도 녹색으로 표시됩니다.

일부 셸(예: bashstderr이 터미널에 연결되지 않은 경우)은 대화형으로 실행되지 않습니다. 이 문제를 해결하기 위해 실행할 수 있지만 bash -ibash의 readline은 stderr에 입력 에코를 출력하므로 빨간색으로 나타납니다. readline(예: gdb 또는 Python)을 사용하는 다른 응용 프로그램은 stdout 또는 stderr을 사용하거나 /dev/tty를 입력 에코, YMMV로 열 수 있습니다. TUI 앱의 상황은 더욱 악화될 수 있습니다.

관련 정보