비 tty와 상호 작용할 때 systemctl을 컬러로 인쇄하려면 어떻게합니까? 다음 명령을 실행할 때

다음과 같은 명령을 실행할 때 :

# systemctl status plexmediaserver

나는 좋은 색상의 출력을 얻습니다. 그러나 다음 명령을 실행할 때 :

# watch -n300 --color systemctl status plexmediaserver

watch에서 색상 으로이 명령을 수행 할 수있는 방법이 systemctl있습니까? 매뉴얼 페이지를 systemctl보았지만 어디에서나 색상에 대한 참조는 보이지 않습니다.



답변

watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

man systemd 말한다

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

즉, 컬러 모드를 강제로 적용 할 수 있습니다.


답변

systemctl출력 색상을 지정할시기를 지정하는 메커니즘이없는 것 같습니다. 빠른 해결책은 isatty(3)항상 진실을 돌려 주도록 shim 하는 것 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표준 입력) ( -). 나머지 플래그는 gcc라는 공유 객체 파일을 만들 도록 지시합니다 isatty.so. 이는 isatty합법적 인 값을 반환하는 데 의존하는 다른 프로그램을 손상시킬 수 있습니다. 그러나 출력의 색상을 지정할지 여부를 결정하기 위해 단독으로 사용되는 systemctl것처럼 isatty보이 므로 괜찮습니다 .


답변

를 기반으로 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" "$@"


답변