Ngay lập tức cho biết đầu ra nào được gửi đến stderr


8

Khi tự động hóa một tác vụ, việc kiểm tra nó bằng tay trước là điều hợp lý. Tuy nhiên, sẽ rất hữu ích nếu bất kỳ dữ liệu nào đến stderr có thể được nhận ra ngay lập tức như vậy và có thể phân biệt được với dữ liệu sẽ xuất hiện và có tất cả đầu ra cùng nhau để biết rõ ràng chuỗi sự kiện là gì.

Một liên lạc cuối cùng sẽ là tốt đẹp nếu, khi thoát khỏi chương trình, nó đã in mã trả về của nó.

Tất cả những điều này sẽ hỗ trợ trong việc tự động hóa. Có, tôi có thể lặp lại mã trả về khi chương trình kết thúc và có, tôi có thể chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn; những gì tôi thực sự thích nó một số shell, script hoặc redirector dễ sử dụng hiển thị stdout màu đen, hiển thị stderr xen kẽ với màu đỏ và in mã thoát ở cuối.

Có một con thú như vậy? [Nếu có vấn đề, tôi đang sử dụng Bash 3.2 trên Mac OS X].


Cập nhật : Xin lỗi đã được vài tháng kể từ khi tôi xem xét điều này. Tôi đã đưa ra một kịch bản thử nghiệm đơn giản:

#!/usr/bin/env python
import sys

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

Trong thử nghiệm của tôi (và có lẽ là do cách mọi thứ được đệm), rse và hilite hiển thị mọi thứ từ thiết bị xuất chuẩn và sau đó là mọi thứ từ thiết bị lỗi chuẩn. Phương thức fifo có được thứ tự đúng nhưng dường như làm hỏng mọi thứ theo dòng stderr. ind phàn nàn về các dòng stdin và stderr của tôi, và sau đó đặt đầu ra từ stderr cuối cùng.

Hầu hết các giải pháp này đều khả thi, vì nó không phải là không điển hình khi chỉ có đầu ra cuối cùng đi đến stderr, nhưng vẫn tốt, có một cái gì đó hoạt động tốt hơn một chút.


Nếu bạn lười biếng (hoặc bị đau ngón tay) như tôi, bạn có thể lấy một mạng con với các giải pháp bên dưới (ví dụ: rse zsh) và bây giờ tất cả các lệnh tô màu stderr.
thiên vị

Câu trả lời:


3

Bạn cũng có thể xem stderred: https://github.com/sickill/stderred


Thật không may, stderred phá vỡ "mở" và "mvim" cho người dùng Mac như OP.
AlcubierreDrive

Điều này hoạt động rất độc đáo, và có được thứ tự đầu ra theo đúng cách do cách thức hoạt động. Thiết lập nó một lần và bật nó trong hồ sơ của bạn, và bạn nhận được thông báo màu đỏ bất cứ khi nào stderr được viết.
Clinton Blackmore


9

Tôi vừa nghĩ ra một phương pháp điên rồ liên quan đến FIFO.

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

Nếu bạn muốn đầu ra stderr riêng biệt, bạn có thể mở hai shell riêng biệt và chạy " grep --color . foo" trong một mà không cần &, sau đó chạy lệnh trong cái còn lại (vẫn với 2>foo). Bạn sẽ nhận được thiết bị lỗi chuẩn trong grepmột và thiết bị xuất chuẩn trong cái chính.

Điều này hoạt động vì đầu ra stderr được chuyển qua FIFO vào grep --color, có màu mặc định là màu đỏ (ít nhất là đối với tôi). Khi bạn đã hoàn tất, chỉ cần rmFIFO ( rm foo).

Hãy cẩn thận : Tôi thực sự không chắc chắn làm thế nào điều này sẽ xử lý thứ tự đầu ra, bạn sẽ phải kiểm tra nó.


Điều đó khá hấp dẫn.
Clinton Blackmore

7

Vâng, điều này là có thể. Nhìn vào phần "Tạo STDERR màu đỏ" trên trang web này để biết ví dụ hoạt động.

Mã cơ bản là đây

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

Một lời giải thích ngắn gọn được đưa ra trong chính chức năng. Những gì đang làm là di chuyển STDOUT và STDERR về, vì vậy sed được STDERR trong 1, tô màu cho nó, và sau đó hoán đổi nó trở lại. Hãy nghĩ về luồng tập tin 3 như một biến tạm thời ở đây.

Cuộc gọi khá đơn giản

rse commands

Tuy nhiên, một số yêu cầu nhất định sẽ không hoạt động như mong đợi; tất cả hãy cẩn thận trên trang được liên kết

Btw, tôi nghĩ rằng cũng có thể đi kèm với một giải pháp của hình thức

commands | rse 

trong đó rse sẽ tô màu đầu ra.

Tôi cũng tìm thấy dự án hilite này dường như để làm điều này. Tôi đã không thử nó, nhưng nó có thể là những gì bạn đang tìm kiếm.

hilite là một tiện ích nhỏ thực thi lệnh bạn chỉ định, làm nổi bật bất cứ thứ gì được in ra stderr. Nó được thiết kế chủ yếu để sử dụng với các bản dựng, để làm cho các cảnh báo và lỗi xuất hiện giống như một sáo ngữ đau đớn.

Các dự án liên quan khác:


rse và hilite khá gần với những gì tôi muốn.
Clinton Blackmore

1

Một chương trình khác là:

http: // www.habets.pp.se/synscan/programs.php?prog=ind (bạn phải tự lắp ráp siêu liên kết, tôi không có đủ điểm cho nhiều hơn một câu trả lời). Có một ảnh chụp màn hình và thậm chí là một screencast ở đó.

Nó chạy quy trình con trong một pty, mà những người khác có thể không. Điều này có thể quan trọng khi vấn đề trật tự (thường xảy ra), vì stderr ngay lập tức bị xóa trong các thiết bị đầu cuối và thiết bị xuất chuẩn được đệm hoàn toàn khi nó không phải là một tty.

Để được giải thích đầy đủ, hãy xem điều này: http://blog.habets.pp.se/2008/06/Buffering-in-pipes

Ngoài ra, ind hoạt động với các chương trình tương tác và nhân vật điều khiển. Bash hoạt động giống như bình thường khi bắt đầu với "ind bash -i".

Điều này có thể hoạt động để cung cấp cho bạn màu sắc trong khi duy trì Ctrl-P et.al.

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

1

Dưới đây là rất nhiều câu trả lời để làm nổi bật đầu ra stderr. Tôi chỉ có thể thêm một thứ khá dễ dàng - trong một hàng, mà bạn đính kèm vào lệnh:

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

Nhưng bạn phải thêm điều này sau lệnh mỗi lần.

Cá nhân tôi, giống như khả năng được đề cập bởi @nagul, hàm rse được thêm vào bashrc.

Nhưng tôi muốn thêm giải pháp để in mã thoát. Bạn có thể thêm giá trị này vào đầu hàng dấu nhắc bash của bạn:

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

Trong đó EC là mã thoát của lệnh.

Tôi đã cài đặt theo cách này, khi mã thoát là 0, nó sẽ không được in, nhưng bất kỳ giá trị nào khác được in trước dấu nhắc tiếp theo có màu đỏ.

Toàn bộ thủ thuật được thực hiện trong ~ / .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

Dòng dấu nhắc theo mặc định được xác định bởi biến PS1. Sao chép bất cứ thứ gì bạn có ở đây vào biến PROMPT và sau đó tạo biến PS1 có hoặc không có mã thoát.

Bash sẽ hiển thị thông tin trong biến PS1 trong lời nhắc.


Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn!
Dylon

1

annotate-outputtiện ích ( devscriptsgói Debian), nếu bạn muốn làm điều đó mà không có màu sắc

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.