与非tty交互时,如何使systemctl彩色打印?


19

当我运行这样的命令时:

# systemctl status plexmediaserver

我得到很好的彩色输出。但是当我运行以下命令时:

# watch -n300 --color systemctl status plexmediaserver

有什么办法可以watch用from的颜色执行此命令systemctl?我已经看过手册页,systemctl但是在任何地方都没有看到对颜色的引用。


请考虑接受towolf的答案,该答案要比当前接受的答案(您的答案)好得多。先感谢您。
Piotr Dobrogost

Answers:


17
watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

man systemd

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

即,您可以强制使用颜色模式。


…当然,到目前为止,SYSTEMD_COLORS它的作用远不如其名称所暗示的那样,因为在2018年中期引入了对可点击链接的支持,使用一些转义码和URL化URL乱丢了输出–幸运的是,可以使用SYSTEMD_URLIFY=0
eMPee584 '19

23

systemctl似乎没有指定何时着色输出的机制。一种快速的解决方案是使填充isatty(3)始终返回true,从而诱使systemctlstdout具有交互性。即您可以:

# echo "int isatty(int fd) { return 1; }" | gcc -O2 -fpic -shared -ldl -o isatty.so -xc -
# LD_PRELOAD=./isatty.so watch -n300 --color systemctl status plexmediaserver

所述-xc -在所述的端部gcc命令告诉gcc编译C代码(-xc从标准)( -)。其余标志指示gcc创建一个名为的共享库文件isatty.so。注意,这很可能破坏其他依赖于isatty返回合法值的程序。但是,它似乎很好,systemctl因为isatty似乎仅用于确定它是否应该为其输出着色。


太好了 我构建了一个脚本来自动执行该过程
汤姆·黑尔

1
在我阅读并投票了towolf的答案(比这个要好得多)之后,我打算投票否决这个问题,但这太完美了,所以我以某种混合的感觉投票了:)
Piotr Dobrogost

2

基于@KarlC的答案,下面是一个脚本,该脚本在运行时生成并包含该库:

#!/bin/bash
set -euo pipefail

function clean_up {
  trap - EXIT # Restore default handler to avoid recursion
  [[ -e "${isatty_so:-}" ]] && rm "$isatty_so"
}
# shellcheck disable=2154 ## err is referenced but not assigned
trap 'err=$?; clean_up; exit $err' EXIT HUP INT TERM

isatty_so=$(mktemp --tmpdir "$(basename "$0")".XXXXX.isatty.so)
echo "int isatty(int fd) { return 1; }" \
  | gcc -O2 -fpic -shared -ldl -o "$isatty_so" -xc -
# Allow user to SH=/bin/zsh faketty mycommand
"${SH:-$SHELL}" -c 'eval $@' - LD_PRELOAD="$isatty_so" "$@"

...什么是黑客😅
eMPee584
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.