GNU/Linux >> Linux の 問題 >  >> Linux

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

systemctl 出力にいつ色を付けるかを指定するメカニズムがないようです。簡単な解決策は isatty(3) をシムすることです 常に true を返すため、systemctl をだます stdout は対話型であると考えます。つまり、次のことができます:

# 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 として 出力に色を付けるかどうかを決定する目的でのみ使用されているようです。


watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

man systemd 言う

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

つまり、これでカラー モードを強制できます。


@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 [email protected]' - LD_PRELOAD="$isatty_so" "[email protected]"

Linux
  1. FreeBSDクラウドサーバーを使い始める方法

  2. 標準入力からsedを読み取るにはどうすればよいですか?

  3. IP (Linux) からホスト名を取得するには?

  1. VimをTmuxで適切に動作させる方法は?

  2. パッド入りの中央揃えで変数を印刷するにはどうすればよいですか?

  3. uidからユーザー名を取得する方法

  1. Linux:ターミナルからのコマンドでリモートページの読み込み時間を取得するにはどうすればよいですか?

  2. 末尾にスラッシュが付いたディレクトリをリストするためにLsを取得するにはどうすればよいですか?

  3. Virshを使用して最初からVmを作成する方法は?