다음과 같은 명령을 실행할 때 :
# 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" "$@"