我想要一种简单的方法,在 zsh 中以红色显示错误,以绿色显示输入。我发现这个回应,效果很好,但它没有实现输入颜色。我不是一个真正的unix开发者,所以我尝试了一些东西,但它不起作用。如何使用此方法或类似方法将输入颜色更改为绿色?
这是我的实际内容.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 或输入 echo 完成(通过内核或实现自己的行编辑器并打开/dev/tty
而不是使用 stdout/stderr 进行 echo 的应用程序),您可以使您的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
将显示为绿色。
某些 shell(例如,bash
当其 stderr 未连接到终端时)不会以交互方式运行。您可以运行bash -i
来解决这个问题,但请注意,由于 bash 的 readline 在 stderr 上输出输入回显,因此它将显示为红色。其他使用 readline 的应用程序(例如 gdb 或 python)可能会使用 stdout 或 stderr 或打开 /dev/tty 作为输入 echo、YMMV。 TUI 应用程序的情况可能会变得更糟。