ฉันจะให้ systemctl พิมพ์สีได้อย่างไรเมื่อถูกโต้ตอบด้วยสิ่งที่ไม่ใช่ tty?


19

เมื่อฉันเรียกใช้คำสั่งเช่นนี้:

# systemctl status plexmediaserver

ฉันได้รับสีที่มีคุณภาพดี แต่เมื่อฉันเรียกใช้คำสั่งต่อไปนี้:

# watch -n300 --color systemctl status plexmediaserver

มีวิธีใดบ้างที่ฉันสามารถใช้watchคำสั่งนี้ด้วยสีได้systemctl? ฉันดูหน้าคนsystemctlแต่ไม่เห็นการอ้างอิงถึงสีทุกที่


โปรดพิจารณายอมรับคำตอบของ towolf ซึ่งดีกว่าคำตอบที่ยอมรับในปัจจุบัน (ของคุณ) ขอบคุณล่วงหน้า.
Piotr Dobrogost

คำตอบ:


17
watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

man systemd กล่าวว่า

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

นั่นคือคุณสามารถบังคับใช้โหมดสีได้


…และแน่นอนตอนนี้SYSTEMD_COLORSทำมากกว่าชื่อแนะนำเพราะในช่วงกลางปี ​​2561 ได้มีการสนับสนุนลิงก์แบบคลิกได้แนะนำเอาท์พุทที่ทิ้งขยะด้วยโค้ดหลบหนีและ URL ที่ถูก urlified ซึ่งโชคดีที่สามารถปิดได้ด้วยSYSTEMD_URLIFY=0
eMPee584

23

systemctlดูเหมือนจะไม่มีกลไกในการระบุเวลาที่จะให้สีออกมา วิธีแก้ปัญหาอย่างรวดเร็วคือการใช้ shim isatty(3)เพื่อคืนค่าจริงเสมอดังนั้นการหลอกให้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) จาก stdin ( -) ส่วนที่เหลือของธงบอกจะสร้างไฟล์วัตถุที่ใช้ร่วมกันตั้งชื่อgcc isatty.soโปรดทราบว่าการทำเช่นนี้อาจทำให้โปรแกรมอื่น ๆisattyเสียหายซึ่งต้องอาศัยการคืนค่าที่ถูกต้อง อย่างไรก็ตามดูเหมือนว่าจะใช้ได้systemctlตามที่isattyดูเหมือนว่าจะใช้เพียงเพื่อจุดประสงค์ในการพิจารณาว่าควรให้สีเอาต์พุตหรือไม่


อันนี้ยอดเยี่ยม ฉันสร้างสคริปต์เพื่อทำให้กระบวนการ
Tom Hale

1
หลังจากที่ฉันอ่านและโหวตคำตอบของ towolf (ซึ่งดีกว่าอันนี้) ฉันจะ downvote นี้ แต่มันแฮ็คที่สมบูรณ์แบบเกินไปดังนั้นแทนที่จะฉันลงคะแนนนี้ด้วยความรู้สึกที่หลากหลาย :)
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" "$@"

... แฮ็คอะไร e
eMPee584
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.