16

Когда я запускаю такую команду:

# systemctl status plexmediaserver

Я получаю красиво окрашенный вывод. Но когда я запускаю следующую команду:

# watch -n300 --color systemctl status plexmediaserver

Есть ли способ, которым я могу сделать эту команду watch с цветом из systemctl? Я просматривал справочную страницу для systemctl но нигде не вижу ссылки на цвет.

3 ответа3

23

systemctl , не имеет механизма для указания, когда окрашивать вывод. Быстрое решение состоит в том, чтобы isatty(3) всегда возвращал истину, таким образом обманывая systemctl в выводе мышления интерактивно. А именно вы могли бы сделать:

# 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) из stdin (-). Остальные флаги говорят gcc создать общий объектный файл с именем isatty.so . Обратите внимание, что это вполне может сломать другие программы, которые полагаются на isatty для возврата допустимого значения. Однако для systemctl как isatty , по-видимому, используется исключительно для определения того, должен ли он окрашивать вывод.

12
watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

говорит man systemd

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

то есть, вы можете включить цветовой режим с этим.

1

Основываясь на ответе @ 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" "$@"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .