तुरंत बताएं कि कौन सा आउटपुट स्टॉडर को भेजा गया था


8

किसी कार्य को स्वचालित करते समय, इसे पहले मैन्युअल रूप से परीक्षण करना समझदारी है। यह मददगार होगा, हालांकि, अगर स्टडर पर जाने वाले किसी भी डेटा को तुरंत पहचान लिया जा सकता है, और स्टडआउट जाने वाले डेटा से अलग, और सभी आउटपुट को एक साथ रखने के लिए तो यह स्पष्ट है कि घटनाओं का अनुक्रम क्या है।

एक अंतिम स्पर्श जो अच्छा होगा अगर, प्रोग्राम से बाहर निकलने पर, उसने अपना रिटर्न कोड प्रिंट किया।

इन सभी चीजों को स्वचालित करने में सहायता मिलेगी। हां, जब प्रोग्राम खत्म हो जाता है, तो मैं रिटर्न कोड की गूंज कर सकता हूं और हां, मैं स्टडआउट और स्टेडर को रीडायरेक्ट कर सकता हूं; मैं वास्तव में इसे कुछ खोल, स्क्रिप्ट, या आसानी से उपयोग में आने वाले पुनर्निर्देशक को पसंद करूंगा जो कि काले रंग में स्टडआउट दिखाता है, लाल रंग में इसके साथ स्टैडर को इंटरएक्टिव दिखाता है, और अंत में निकास कोड प्रिंट करता है।

क्या ऐसा कोई जानवर है? [अगर यह मायने रखता है, तो मैं मैक ओएस एक्स पर बैश 3.2 का उपयोग कर रहा हूं]।


अपडेट : क्षमा करें, इस महीने के बाद से मैंने इसे देखा है। मैं एक साधारण परीक्षण स्क्रिप्ट के साथ आया हूँ:

#!/usr/bin/env python
import sys

print "this is stdout"
print >> sys.stderr, "this is stderr"
print "this is stdout again"

मेरे परीक्षण में (और शायद जिस तरह से चीजों को बफ़र किया गया है) के कारण, rse और hilite stdout से सब कुछ और फिर stderr से सब कुछ प्रदर्शित करते हैं। पेंडो विधि को आदेश सही मिलता है लेकिन स्टैडर लाइन के बाद सब कुछ कोलोरिज़ करने के लिए प्रकट होता है। ind ने मेरे stdin और stderr लाइनों के बारे में शिकायत की, और फिर पिछले stderr से आउटपुट डाल दिया।

इनमें से अधिकांश समाधान व्यावहारिक हैं, क्योंकि यह केवल अंतिम आउटपुट के लिए stderr पर जाने के लिए atypical नहीं है, लेकिन फिर भी, कुछ ऐसा करना अच्छा होगा जो थोड़ा बेहतर काम करता है।


यदि आप मेरी तरह आलसी हैं (या उँगलियाँ हैं) तो आप नीचे दिए गए समाधानों (जैसे कि rse zsh) के साथ एक उपसमूह हड़प सकते हैं और अब सभी कमांड स्टैडर को रंगीन करते हैं।
पूर्वाग्रह

जवाबों:


3

आप stderred की जाँच भी कर सकते हैं: https://github.com/sickill/stderred


दुर्भाग्य से, स्टाफ़र्ड ओपी जैसे मैक उपयोगकर्ताओं के लिए "ओपन" और "एमविम" तोड़ता है।
अलक्यूबियरड्राइव

यह बहुत अच्छी तरह से काम करता है, और जिस तरह से यह काम करता है उसके कारण सही फैशन में आउटपुट ऑर्डर प्राप्त करता है। इसे एक बार सेट करें, और इसे अपने प्रोफ़ाइल में चालू करें, और जब भी stderr को लिखा जाता है, तब आपको लाल संदेश मिलते हैं।
क्लिंटन ब्लैकमोर


9

मैंने सिर्फ एक पागल विधि तैयार की जिसमें एफआईएफओ शामिल है।

$ mkfifo foo
$ grep --color . foo &
$ your_command 2>foo

यदि आप stderr आउटपुट अलग चाहते हैं, तो आप दो अलग-अलग शेल खोल सकते हैं और grep --color . fooएक के बिना " " &चला सकते हैं, फिर दूसरे में कमांड को चला सकते हैं (अभी भी 2>foo)। आप grepएक में stderr और मुख्य एक में stdout प्राप्त करेंगे ।

यह काम करता है क्योंकि Stderr आउटपुट FIFO के माध्यम से रूट किया जाता है grep --color, जिसका डिफ़ॉल्ट रंग लाल है (कम से कम यह मेरे लिए है)। जब आप पूरा कर लें, तो बस rmफीफो ( rm foo)।

कैविएट : मुझे वास्तव में यकीन नहीं है कि यह आउटपुट ऑर्डर कैसे संभालेंगे, आपको इसका परीक्षण करना होगा।


यह बहुत चालाक है।
क्लिंटन ब्लैकमोर

7

हां, यह संभव है। एक कार्यशील उदाहरण के लिए इस साइट पर "Make STDERR लाल" अनुभाग देखें

मूल कोड यह है

# 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
}

समारोह में एक संक्षिप्त विवरण दिया गया है। क्या करता है STDOUT और STDERR के बारे में है, तो sed 1 में STDERR हो जाता है, इसे रंग देता है, और फिर इसे वापस स्वैप करता है। यहाँ एक अस्थायी चर के रूप में फाइल स्ट्रीम 3 के बारे में सोचो।

कॉल बहुत सरल है

rse commands

हालांकि, कुछ निश्चित चालान अपेक्षा के अनुरूप काम नहीं करेंगे; सभी जुड़े पृष्ठ पर कैविट्स उपलब्ध हैं।

Btw, मुझे लगता है कि फॉर्म के समाधान के साथ आना भी संभव है

commands | rse 

जहां rse आउटपुट को कलर करेगा।

मुझे यह हिललाइट प्रोजेक्ट भी मिला जो ऐसा लगता है। मैंने इसे आज़माया नहीं है, लेकिन यह वही हो सकता है जो आप खोज रहे हैं।

hilite एक छोटी सी उपयोगिता है जो आपके द्वारा निर्दिष्ट आदेश को निष्पादित करता है, जो किसी भी चीज़ को stderr पर मुद्रित करता है। यह मुख्य रूप से बिल्ड्स के साथ उपयोग करने के लिए बनाया गया है, चेतावनी और त्रुटियों को दूर करने के लिए एक पीड़ादायक क्लिच की तरह है।

अन्य संबंधित परियोजनाएं:


rse और hilite मेरे चाहने के काफी करीब हैं।
क्लिंटन ब्लैकमोर

1

एक और कार्यक्रम इंडस्ट्रीज़ है:

http: // www.habets.pp.se/synscan/programs.php?prog=ind (आपको खुद हाइपरलिंक को इकट्ठा करना होगा, मेरे पास प्रति उत्तर एक से अधिक अंकों के लिए पर्याप्त अंक नहीं हैं)। वहां स्क्रीनशॉट और यहां तक ​​कि एक स्क्रीनकास्ट भी है।

यह उप-भाग को एक खूंटी में चलाता है, जिसे अन्य शायद नहीं करते हैं। यह वह जगह हो सकती है जहां ऑर्डर मायने रखता है (यह अक्सर करता है), चूंकि स्टडर को टर्मिनलों में तुरंत फ्लश किया जाता है और जब यह टटी नहीं होती है तो स्टडआउट पूरी तरह से बफर हो जाता है।

पूर्ण विवरण के लिए, इसे देखें: http://blog.habets.pp.se/2008/06/Buffering-in-pipes

इसके अलावा, इंडस्ट्रीज़ इंटरेक्टिव प्रोग्राम्स और कंट्रोल कैरेक्टर्स के साथ काम करता है। बैश "इंड बैश -आई" के साथ शुरू होने पर सामान्य की तरह काम करता है।

यह Ctrl-P et.al को संरक्षित करते हुए आपको रंग देने का काम कर सकता है।

ind -P $(echo -ne '\033[31;1m') -p $(echo -ne '\033[0m') bash -i

1

यहाँ अभी भी स्टैडर आउटपुट को हाइलाइट करने के लिए बहुत सी प्रतिक्रियाएँ हैं। मैं केवल एक बहुत आसान जोड़ सकता हूं - एक पंक्ति में, जिसे आप कमांड में संलग्न करते हैं:

command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m"; done)

लेकिन आपको इसे हर बार कमांड के बाद जोड़ना होगा।

मैं, व्यक्तिगत रूप से, @nagul द्वारा उल्लिखित संभावना की तरह, rse फ़ंक्शन को bashrc में जोड़ा गया।

लेकिन मैं बाहर निकलने के कोड को प्रिंट करने के लिए समाधान जोड़ना चाहता हूं। आप इस मूल्य को अपनी बैश प्रॉम्प्ट पंक्ति की शुरुआत में जोड़ सकते हैं:

hostname$ command
  Some error occurred. Returned exit code.
EC hostname$

जहां EC कमांड का एक्जिट कोड है।

मैंने इसे इस तरह से सेट किया है, कि जब एक्जिट कोड 0 होता है, तो इसे प्रिंट नहीं किया जाएगा, लेकिन लाल रंग में अगले प्रॉम्प्ट से पहले किसी भी अन्य मूल्य को प्रिंट किया जाता है।

पूरी ट्रिक ~ / .bashrc में की गई है:

my_prompt() {
 EXITSTATUS="$?"
 RED="\[\033[1;31m\]"
 OFF="\[\033[m\]"

PROMPT="${debian_chroot:+($debian_chroot)}\h \$ "

if [ "${EXITSTATUS}" -eq 0 ]; then
   PS1="${PROMPT}"
else
   PS1="${RED}$EXITSTATUS${OFF} ${PROMPT}"
fi
}

PROMPT_COMMAND=my_prompt

प्रांप्ट लाइन PS1 चर द्वारा डिफ़ॉल्ट रूप से परिभाषित की गई है। आपके पास जो कुछ भी यहाँ है उसे PROMPT में कॉपी करें और फिर बाहर निकलें कोड के साथ या बिना PS1 चर बनाएं।

Bash प्रॉम्प्ट में PS1 चर में जानकारी दिखाएगा।


यह वही है जो मैं देख रहा था, धन्यवाद!
Dylon

1

वहाँ annotate-outputउपयोगिता ( devscriptsDebian पैकेज), यदि आप रंग के बिना यह करना चाहते हैं

$ annotate-output /tmp/test.py    
14:24:57 I: Started /tmp/test.py
14:24:57 E: this is stderr
14:24:57 O: this is stdout
14:24:57 O: this is stdout again
14:24:57 I: Finished with exitcode 0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.