非ttyから対話するときにsystemctlをカラーで印刷させるにはどうすればよいですか?


19

このようなコマンドを実行すると:

# systemctl status plexmediaserver

きれいな色の出力が得られます。しかし、次のコマンドを実行すると:

# watch -n300 --color systemctl status plexmediaserver

watchから色でこのコマンドを実行する方法はありますsystemctlか?私はマニュアルページを見てきましたが、systemctl色の参照はどこにも見当たりません。


towolfの回答を受け入れることを検討してください。これは、現在受け入れられている(あなたの)回答よりもはるかに優れています。前もって感謝します。
ピョートルドブロゴスト

回答:


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)、常にtrueを返すようにシムすることです。そのため、systemctlstdoutはインタラクティブであると考えるようになります。つまり、あなたができる:

# 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
towolfの回答(これよりもはるかに良い)を読んで投票した後、私はこれに投票するつもりでしたが、これはハックとしては完璧すぎるので、代わりに私は何らかの形でこれを投票しています:)
Piotr 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.