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


19

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

# systemctl status plexmediaserver

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

# watch -n300 --color systemctl status plexmediaserver

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


현재 허용되는 것 (귀하의 것)보다 훨씬 나은 towolf의 대답 을 받아들이십시오 . 미리 감사드립니다.
Piotr Dobrogost 2018 년

답변:


17
watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

man systemd 말한다

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

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


... 물론, 지금 쯤은 SYSTEMD_COLORS더 이름에서 알 수보다하지, 클릭 가능한 링크 중순 2018 지원이 도입되었다 때문에, 일부 이스케이프 코드 및 urlified URL을 쓰레기 출력 - 다행으로 해제 할 수 있습니다SYSTEMD_URLIFY=0
eMPee584

23

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보이 므로 괜찮습니다 .



1
내가 읽고 내가 이것을 downvote려고까지 (이보다 훨씬 낫다) towolf의 답변을 투표를하지만이 역시 해킹을 완벽 그래서 대신 내가 : 어떻게 든 혼합 된 감정이를 투표하고있어 후
표트르 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.