Як змусити systemctl друкувати кольоровим кольором під час взаємодії з нетиткою?


19

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

# systemctl status plexmediaserver

Я отримую красиво кольоровий вихід. Але коли я запускаю таку команду:

# watch -n300 --color systemctl status plexmediaserver

Чи є якийсь спосіб я виконати цю watchкоманду з кольором systemctl? Я переглянув сторінку чоловіка, systemctlале ніде не бачу посилання на колір.


Будь ласка, подумайте про прийняття відповіді на те, що набагато краще, ніж прийнято на даний момент (ваше). Спасибі заздалегідь.
Пьотр Доброгост

Відповіді:


17
watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

man systemd каже

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

тобто ви можете з цим застосувати кольоровий режим.


… І, звичайно, на сьогоднішній день SYSTEMD_COLORSце вже більше, ніж випливає з назви, тому що в середині 2018 року було запроваджено підтримку клікових посилань, вивільнений вихід з деякими кодами епіляції та урліфікованими URL-адресами, які, на щастя, можна вимкнутиSYSTEMD_URLIFY=0
eMPee584

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здається, використовується виключно для того, щоб визначити, чи слід фарбувати його вихід.



1
Після того, як я прочитав і проголосував відповідь "волака" (що набагато краще, ніж цей), я збирався спростувати це, але це занадто досконалий хакер, тому натомість я голосую за це якось змішаними почуттями :)
Пьотр Доброгост,

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.