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