บอกได้ทันทีว่าเอาต์พุตใดถูกส่งไปที่ stderr


8

เมื่อทำงานอัตโนมัติเป็นเรื่องที่สมเหตุสมผลที่จะทดสอบด้วยตนเองก่อน มันจะมีประโยชน์ แต่ถ้าข้อมูลใด ๆ ที่ไปถึง stderr นั้นสามารถจดจำได้ทันทีเช่นนี้และแยกแยะได้จากข้อมูลที่จะ stdout และให้เอาท์พุททั้งหมดเข้าด้วยกันดังนั้นจึงเป็นที่ชัดเจนว่าลำดับเหตุการณ์คืออะไร

สัมผัสสุดท้ายที่ดีถ้าอยู่ที่ทางออกของโปรแกรมมันจะพิมพ์รหัสส่งคืน

ทุกสิ่งเหล่านี้จะช่วยในการทำให้เป็นอัตโนมัติ ใช่ฉันสามารถสะท้อนกลับรหัสเมื่อโปรแกรมเสร็จสิ้นและใช่ฉันสามารถเปลี่ยนเส้นทาง stdout และ stderr; สิ่งที่ฉันชอบเปลือกหอยสคริปต์หรือตัวเปลี่ยนเส้นทางที่ใช้งานง่ายซึ่งแสดง stdout เป็นสีดำแสดง stderr interleaved ด้วยสีแดงและพิมพ์รหัสทางออกที่ท้าย

มีสัตว์ร้ายเช่นนี้ไหม? [หากเป็นเรื่องสำคัญฉันกำลังใช้ Bash 3.2 บน Mac OS X]


อัปเดต : ขออภัยเป็นเวลาหลายเดือนแล้วตั้งแต่ฉันได้ดูสิ่งนี้ ฉันมากับสคริปต์ทดสอบง่ายๆ:

#!/usr/bin/env python
import sys

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

ในการทดสอบของฉัน (และอาจเป็นเพราะวิธีการบัฟเฟอร์), Rse และไฮไลต์แสดงทุกอย่างจาก stdout และทุกอย่างจาก stderr วิธี Fifo ได้รับการสั่งซื้อที่ถูกต้อง แต่ดูเหมือนจะ colourize ทุกอย่างตามสาย stderr ind บ่นเกี่ยวกับ stdin และ stderr ของฉันและจากนั้นใส่เอาต์พุตจาก stderr ครั้งสุดท้าย

โซลูชันเหล่านี้ส่วนใหญ่สามารถใช้การได้เนื่องจากไม่ใช่เรื่องผิดปกติสำหรับผลลัพธ์สุดท้ายเท่านั้นที่ไปที่ stderr แต่ก็ยังดีที่มีสิ่งที่ทำงานได้ดีกว่าเล็กน้อย


หากคุณขี้เกียจ (หรือมีอาการเจ็บนิ้ว) เช่นฉันคุณสามารถคว้า subshell ด้วยโซลูชันด้านล่าง (เช่น rse zsh) และตอนนี้คำสั่งทั้งหมด colorize stderr
อคติ

คำตอบ:


3

นอกจากนี้คุณยังสามารถดู stderred: https://github.com/sickill/stderred


น่าเสียดายที่ stderred แบ่ง "open" และ "mvim" สำหรับผู้ใช้ Mac เช่น OP
AlcubierreDrive

สิ่งนี้ทำงานได้ดีมากและรับลำดับผลลัพธ์ในรูปแบบที่ถูกต้องเนื่องจากวิธีการทำงาน ตั้งค่าครั้งเดียวและเปิดในโปรไฟล์ของคุณและคุณจะได้รับข้อความสีแดงเมื่อใดก็ตามที่เขียนถึง stderr
Clinton Blackmore


9

ฉันเพิ่งคิดวิธีบ้าที่เกี่ยวข้องกับ FIFO

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

หากคุณต้องการให้เอาต์พุต stderr แยกกันคุณสามารถเปิดเชลล์แยกสองอันและเรียกใช้ " grep --color . foo" ในอันเดียวโดยไม่&ใช้คำสั่งจากนั้นเรียกใช้คำสั่งในอีกอัน (ยังคงอยู่กับ2>foo) คุณจะได้ stderr ในอันที่grepหนึ่งและ stdout ในตัวหลัก

ใช้งานได้เนื่องจากเอาต์พุต stderr ถูกส่งผ่าน FIFO ไปยังgrep --colorซึ่งมีสีเริ่มต้นเป็นสีแดง (อย่างน้อยก็สำหรับฉัน) เมื่อคุณทำเสร็จแล้วเพียงrmFIFO ( rm foo)

Caveat : ฉันไม่แน่ใจว่าสิ่งนี้จะจัดการกับลำดับผลลัพธ์อย่างไรคุณจะต้องทดสอบ


มันค่อนข้างเนียน
Clinton Blackmore

7

ใช่มันเป็นไปได้ ดูที่ส่วน"Make STDERR red" ในเว็บไซต์นี้เพื่อเป็นตัวอย่างการทำงาน

รหัสพื้นฐานคือสิ่งนี้

# 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ได้รับ STDERR ใน 1 สีมันแล้วแลกเปลี่ยนกลับ คิดถึงไฟล์สตรีม 3 เป็นตัวแปรชั่วคราวที่นี่

การโทรนั้นค่อนข้างง่าย

rse commands

อย่างไรก็ตามการร้องขอบางอย่างจะไม่ทำงานอย่างที่คาดไว้ คำเตือนทั้งหมดอยู่ในหน้าเชื่อมโยง

Btw ฉันคิดว่ามันเป็นไปได้ที่จะมาพร้อมกับวิธีแก้ปัญหาของแบบฟอร์ม

commands | rse 

โดยที่ Rse จะทำให้สีออกมาเป็นสี

ฉันยังพบโครงการไฮไลต์ที่ดูเหมือนว่าจะทำเช่นนี้ ฉันยังไม่ได้ลอง แต่อาจเป็นสิ่งที่คุณกำลังมองหา

ไฮไลต์เป็นยูทิลิตี้ขนาดเล็กซึ่งดำเนินการคำสั่งที่คุณระบุโดยเน้นสิ่งที่พิมพ์ไปยัง stderr มันถูกออกแบบมาเพื่อใช้กับงานสร้างเป็นหลักเพื่อทำการเตือนและข้อผิดพลาดต่างๆ

โครงการอื่น ๆ ที่เกี่ยวข้อง:


rse และ hilite นั้นค่อนข้างใกล้เคียงกับที่ฉันต้องการ
Clinton Blackmore

1

อีกโปรแกรมหนึ่งคือ:

http: // www.habets.pp.se/synscan/programs.php?prog=ind (คุณต้องรวบรวมไฮเปอร์ลิงก์ด้วยตัวคุณเองฉันไม่มีคะแนนเพียงพอสำหรับคำตอบมากกว่าหนึ่งข้อ) มีภาพหน้าจอและแม้กระทั่งหน้าจอที่นั่น

มันรันกระบวนการย่อยใน pty ซึ่งคนอื่นอาจไม่ สิ่งนี้สามารถสำคัญในกรณีที่คำสั่งซื้อมีความสำคัญ (บ่อยครั้ง) เนื่องจาก stderr ถูกล้างออกทันทีในเทอร์มินัลและ stdout จะถูกบัฟเฟอร์อย่างสมบูรณ์เมื่อไม่ได้เป็น tty

สำหรับคำอธิบายแบบเต็มดูได้ที่: http://blog.habets.pp.se/2008/06/Buffering-in-pipes

นอกจากนี้ ind ยังทำงานกับโปรแกรมแบบโต้ตอบและอักขระควบคุม Bash ทำงานเหมือนปกติเมื่อเริ่มต้นด้วย "ind bash -i"

สิ่งนี้สามารถใช้เพื่อให้สีแก่คุณในขณะที่ยังคงรักษา Ctrl-P et.al

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

1

นี่คือการตอบกลับจำนวนมากสำหรับการเน้นเอาต์พุต stderr ฉันสามารถเพิ่มได้ง่าย ๆ เพียงอันเดียว - ในหนึ่งแถวซึ่งคุณแนบไปกับคำสั่ง:

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

แต่คุณต้องเพิ่มสิ่งนี้หลังจากคำสั่งในแต่ละครั้ง

โดยส่วนตัวแล้วผมชอบความเป็นไปได้ที่ @nagul พูดถึงฟังก์ชั่น rse ที่เพิ่มเข้าไปใน bashrc

แต่ฉันต้องการเพิ่มโซลูชันสำหรับการพิมพ์รหัสออก คุณสามารถเพิ่มค่านี้ไปยังจุดเริ่มต้นของแถวพรอมต์ bash ของคุณ:

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ยูทิลิตี้ ( devscriptsแพคเกจ Debian) หากคุณต้องการทำโดยไม่มีสี

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