Tty olmayan birinden etkileşimde bulunurken systemctl'nin renkli yazdırmasını nasıl sağlayabilirim?


19

Böyle bir komutu çalıştırdığımda:

# systemctl status plexmediaserver

Güzel renkli çıktılar alıyorum. Ama aşağıdaki komutu çalıştırdığımda:

# watch -n300 --color systemctl status plexmediaserver

Bu watchkomutu renk ile yapabilmemin bir yolu var mı systemctl? Adam sayfasına baktım systemctlama hiçbir yerde renge referans görmüyorum.


Lütfen şu anda kabul edilmiş olandan (sizin) daha iyi olan towolf'un cevabını kabul etmeyi düşünün . Şimdiden teşekkür ederim.
Piotr Dobrogost

Yanıtlar:


17
watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

man systemd diyor

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

yani, renk modunu bununla zorlayabilirsiniz.


… Ve elbette, SYSTEMD_COLORSadından da anlaşılacağı gibi, 2018'in ortalarında tıklanabilir bağlantılar için destek sağlandı, bazı kaçış kodları ve urlifli URL'lerle çıktılar - ki neyse ki kapatılabilirSYSTEMD_URLIFY=0
eMPee584

23

systemctlçıktının ne zaman renklendirileceğini belirleyen bir mekanizmaya sahip gibi görünmüyor. Hızlı bir çözüm isatty(3)her zaman gerçeğe dönmek için şimşek olacaktır, böylece systemctldüşünme stdout'una kandırmak interaktiftir. Yani şunları yapabilirsiniz:

# 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 -Sonunda gcckomut bildirir gcc(Cı kodunu derlemek için -xcstandart giriş dan) ( -). Bayrakların geri kalanı gccadlı bir paylaşılan nesne dosyası oluşturmayı söyler isatty.so. Bunun isattymeşru bir değer döndürmeye dayanan diğer programları çok iyi bozabileceğini unutmayın . Ancak için iyi görünüyor systemctlolarak isattygörünür sadece onun çıkışını renk gerekip gerekmediğini belirlemek amacıyla kullanılacak.



1
Towolf'un cevabını okuduktan ve oy verdikten sonra (ki bundan daha iyi) bunu aşağıya indirecektim ama bu çok mükemmel bir hack, bu yüzden bunun yerine bir şekilde karışık duygular ile oy veriyorum :)
Piotr Dobrogost

2

@ KarlC'nin cevabına dayanarak , çalışma zamanında kitaplığı oluşturan ve daha sonra içeren bir komut dosyası:

#!/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" "$@"

... ne bir kesmek e
eMPee584
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.