गैर-ट्टी से बातचीत करने पर मुझे रंग में मुद्रित करने के लिए व्यवस्थित कैसे मिलता है?


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 का समर्थन पेश किया गया था, कुछ भागने कोड और यूआरएल यूआरएल के साथ कूड़ेदान का उत्पादन - जो सौभाग्य से बंद हो सकता है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(सी कोड संकलन करने -xc) stdin से ( -)। बाकी झंडे gccएक साझा ऑब्जेक्ट फ़ाइल नाम बनाने के लिए कहते हैं isatty.so। ध्यान दें कि यह अन्य कार्यक्रमों को बहुत अच्छी तरह से तोड़ सकता है जो isattyएक वैध मूल्य वापस करने के लिए भरोसा करते हैं । हालाँकि यह ठीक प्रतीत होता है systemctlजैसा isattyकि यह निर्धारित करने के उद्देश्य के लिए उपयोग किया जाता है कि यह अपने आउटपुट को रंगीन करना चाहिए या नहीं।


ये जबरदस्त है। मैंने इस प्रक्रिया को स्वचालित करने के लिए एक स्क्रिप्ट का निर्माण किया ।
टॉम हेल

1
के बाद मैंने पढ़ा और मतदान किया है तोल्फ़ का जवाब (जो इस से बहुत बेहतर है) मैं इसे नीचे जा रहा था, लेकिन यह बहुत ही सही हैक है, इसलिए मैं इसे किसी भी तरह से मिश्रित भावनाओं के साथ वोट कर रहा हूं :)
पियोट्र डोब्रोगोस्ट

2

@ कार्लसी के उत्तर के आधार पर , यहाँ एक स्क्रिप्ट है जो उत्पन्न करती है और फिर रनटाइम में लाइब्रेरी शामिल करती है:

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

... क्या एक हैक
MP
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.