क्या लाल रंग में बैश प्रदर्शन स्टैडर संदेश बनाने का एक तरीका है ?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
बैश और zsh के लिए काम करता है। इसे उत्तर b / c प्रतिष्ठा के रूप में नहीं जोड़ा जा सकता।
क्या लाल रंग में बैश प्रदर्शन स्टैडर संदेश बनाने का एक तरीका है ?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
बैश और zsh के लिए काम करता है। इसे उत्तर b / c प्रतिष्ठा के रूप में नहीं जोड़ा जा सकता।
जवाबों:
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
>&2
पहले सही जोड़कर ; done)
, वास्तव में stderr के लिए इरादा उत्पादन stderr को लिखा है। यदि आप प्रोग्राम के सामान्य आउटपुट को कैप्चर करना चाहते हैं तो यह मददगार है।
tput
, और मेरी राय में थोड़ा अधिक पठनीय है:command 2> >(while read line; do echo -e "$(tput setaf 1)$line$(tput sgr0)" >&2; done)
IFS= read -r line
मदद करनी चाहिए, लेकिन नहीं। यकीन नहीं है कि क्यों।
विधि 1: उपयोग प्रक्रिया प्रतिस्थापन
command 2> >(sed $'s,.*,\e[31m&\e[m,'>&2)
विधि 2: बैश स्क्रिप्ट में कोई फ़ंक्शन बनाएँ:
color()(set -o pipefail;"$@" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1
इसे इस तरह उपयोग करें:
$ color command
दोनों विधियाँ कमांड stderr
को लाल रंग में दिखाएंगी।
विधि 2 कैसे काम करती है, इसकी व्याख्या के लिए पढ़ते रहें। इस कमान द्वारा प्रदर्शित कुछ दिलचस्प विशेषताएं हैं।
color()...
- कलर नामक बैश फंक्शन बनाता है।set -o pipefail
- यह एक शेल विकल्प है जो एक कमांड के एरर रिटर्न कोड को सुरक्षित रखता है जिसका आउटपुट दूसरे कमांड में पाइप किया जाता है। यह एक सबशेल में किया जाता है, जो कोष्ठकों द्वारा बनाया जाता है, ताकि बाहरी शेल में पिपिलफेल विकल्प को न बदलें। "$@"
- नए कमांड के रूप में फ़ंक्शन के तर्कों को निष्पादित करता है। "$@"
के बराबर है"$1" "$2" ...
2>&1
- पुनर्निर्देश stderr
करने के लिए आदेश का stdout
इतना है कि यह हो जाता है sed
की stdin
।>&3
- शॉर्टहैंड के लिए 1>&3
, यह stdout
एक नए अस्थायी फ़ाइल डिस्क्रिप्टर में रीडायरेक्ट करता है 3
। बाद 3
में वापस चला जाता है stdout
।sed ...
- इसके बाद के संस्करण रीडायरेक्ट की वजह से, sed
की stdin
है stderr
निष्पादित आदेश की। इसका कार्य रंग कोड के साथ प्रत्येक पंक्ति को घेरना है।$'...'
एक बैश कंस्ट्रक्शन जिसके कारण बैकस्लैश-एस्कैप्ड कैरेक्टर्स को समझना पड़ता है.*
- पूरी लाइन से मेल खाता है।\e[31m
- एएनएसआई से बचने का क्रम जो निम्न वर्णों को लाल बनाता है&
- sed
प्रतिस्थापित चरित्र जो पूरे मिलान स्ट्रिंग (इस मामले में पूरी लाइन) तक फैलता है।\e[m
- एएनएसआई भागने का क्रम जो रंग को रीसेट करता है।>&2
- आशुलिपि के लिए 1>&2
, यह पुनर्निर्देशन sed
के stdout
लिए है stderr
।3>&1
- अस्थाई फाइल डिस्क्रिप्टर को 3
वापस रीडायरेक्ट करता है stdout
।zsh
?
zsh: color()(set -o pipefail;"$@" 2>&1 1>&3|sed $'s,.*,\e[31m&\e[m,'1>&2)3>&1
आप stderred की जाँच भी कर सकते हैं: https://github.com/sickill/stderred
.bashrc
। हालांकि धन्यवाद!
Stderr को स्थायी रूप से लाल बनाने का bash तरीका 'exec' को redirect धाराओं का उपयोग कर रहा है। अपने bashrc में निम्नलिखित जोड़ें:
exec 9>&2
exec 8> >(
while IFS='' read -r line || [ -n "$line" ]; do
echo -e "\033[31m${line}\033[0m"
done
)
function undirect(){ exec 2>&9; }
function redirect(){ exec 2>&8; }
trap "redirect;" DEBUG
PROMPT_COMMAND='undirect;'
मैंने पहले इस पर पोस्ट किया है: STDOUT और STDERR के लिए फ़ॉन्ट रंग कैसे सेट करें
source ~/.bashrc
साथ दो बार, मेरा टर्मिनल मूल रूप से बंद हो जाता है।
मैंने एक रैपर स्क्रिप्ट बनाई है जो शुद्ध बैश में Balázs पॉज़्सर के उत्तर को लागू करती है। इसे अपने $ PATH में सहेजें और उनके आउटपुट को रंग देने के लिए उपसर्ग कमांड करें।
#! / Bin / bash अगर [$ 1 == "--help"]; फिर गूंज "एक आदेश निष्पादित करता है और सभी त्रुटियों को रंग देता है" गूंज "उदाहरण:` बेसन $ {0} `wget ..." इको "(c) o_O टिंच, ICQ # 1227-700, आनंद लें!" बाहर निकलें 0 फाई # अस्थायी त्रुटि सभी त्रुटियों को पकड़ने के लिए TMP_ERRS = $ (mktemp) # एक्सक्यूट कमांड "$ @" 2>> (लाइन पढ़ते समय; गूंज-ई "\ _ [01; 31 मीटर $ लाइन \ e [0 मी"; टी - $ $ TMP_ERRS; EXIT_CODE = $? # सभी त्रुटियों को फिर से प्रदर्शित करें अगर [-s "$ TMP_ERRS"]; फिर echo -e "\ n \ n \ n \ e [01; 31m === ERRORS === \ e [0m" बिल्ली $ TMP_ERRS फाई rm -f $ TMP_ERRS # समाप्त $ EXIT_CODE से बाहर निकलें
आप इस तरह के एक समारोह का उपयोग कर सकते हैं
#!/bin/sh
color() {
printf '\033[%sm%s\033[m\n' "$@"
# usage color "31;5" "string"
# 0 default
# 5 blink, 1 strong, 4 underlined
# fg: 31 red, 32 green, 33 yellow, 34 blue, 35 purple, 36 cyan, 37 white
# bg: 40 black, 41 red, 44 blue, 45 purple
}
string="Hello world!"
color '31;1' "$string" >&2
मैं append> और 2 stderr करने के लिए मुद्रित करने के लिए
मेरे पास O_o Tync की स्क्रिप्ट का थोड़ा संशोधित संस्करण है। मुझे ओएस एक्स लायन के लिए इन मॉड्स को बनाने की जरूरत थी और यह सही नहीं है क्योंकि लिपटे हुए कमांड को करने से पहले स्क्रिप्ट कभी-कभी पूरी हो जाती है। मैंने एक नींद जोड़ी है, लेकिन मुझे यकीन है कि एक बेहतर तरीका है।
#!/bin/bash
if [ $1 == "--help" ] ; then
echo "Executes a command and colorizes all errors occured"
echo "Example: `basename ${0}` wget ..."
echo "(c) o_O Tync, ICQ# 1227-700, Enjoy!"
exit 0
fi
# Temp file to catch all errors
TMP_ERRS=`mktemp /tmp/temperr.XXXXXX` || exit 1
# Execute command
"$@" 2> >(while read line; do echo -e "$(tput setaf 1)$line\n" | tee -a $TMP_ERRS; done)
EXIT_CODE=$?
sleep 1
# Display all errors again
if [ -s "$TMP_ERRS" ] ; then
echo -e "\n\n\n$(tput setaf 1) === ERRORS === "
cat $TMP_ERRS
else
echo "No errors collected in $TMP_ERRS"
fi
rm -f $TMP_ERRS
# Finish
exit $EXIT_CODE
इस समाधान ने मेरे लिए काम किया: https://superuser.com/questions/28869/immediately-tell-which-output-was-sent-to-stderr
मैंने इस फ़ंक्शन को अपने .bashrc
या .zshrc
:
# Red STDERR
# rse <command string>
function rse()
{
# We need to wrap each phrase of the command in quotes to preserve arguments that contain whitespace
# Execute the command, swap STDOUT and STDERR, colour STDOUT, swap back
((eval $(for phrase in "$@"; do echo -n "'$phrase' "; done)) 3>&1 1>&2 2>&3 | sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/") 3>&1 1>&2 2>&3
}
फिर उदाहरण के लिए:
$ rse cat non_existing_file.txt
मुझे एक लाल आउटपुट देगा।
set -o pipefail;
पहले जोड़ सकते हैं(eval
"
तर्कों में रिक्त स्थान को संरक्षित करने के लिए eval को भी जोड़ते हैं
xargs और printf का उपयोग करना:
command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)