Відразу скажіть, який вихід був надісланий до stderr


8

Автоматизуючи завдання, його розумно спочатку перевірити вручну. Було б корисно, однак, якщо будь-які дані, що надходять до stderr, були негайно розпізнані як такі і відрізнялися від даних, що йдуть до stdout, і мати всі вихідні дані разом, щоб було очевидно, яка послідовність подій.

Останній штрих, який би був приємний - це, якщо при виході з програми надрукував свій код повернення.

Все це допоможе в автоматизації. Так, я можу повторювати код повернення, коли програма закінчується, і так, я можу перенаправляти stdout і stderr; що мені дуже хотілося б, щоб це оболонка, скрипт чи простий у використанні переспрямовувач, який показує stdout у чорному кольорі, показує stderr переплетеним із ним червоним кольором та друкує код виходу в кінці.

Чи є такий звір? [Якщо це має значення, я використовую 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 та hilite відображають все від stdout, а потім і від stderr. Метод fifo отримує порядок правильно, але, здається, забарвлює все, що йде за лінією stderr. ind поскаржився на мої stdin та stderr рядки, а потім поставив вихід із stderr останнім.

Більшість цих рішень є працездатними, оскільки нетипово, щоб лише останній результат перейшов до більш жорсткого, але все-таки було б непогано мати щось, що працювало трохи краще.


Якщо ви ліниві (або у вас болять пальці), як я, ви можете схопити нижню частину корпусу з наведеними нижче рішеннями (наприклад, rse zsh), і тепер усі команди забарвлюють stderr.
упередженість

Відповіді:


3

Ви також можете перевірити stderred: https://github.com/sickill/stderred


На жаль, більш жорсткі перерви "відкриті" та "mvim" для користувачів Mac, як OP.
AlcubierreDrive

Це працює дуже добре, і виходить порядок виводу правильним способом завдяки тому, як він працює. Налаштуйте його один раз і ввімкніть його у своєму профілі, і ви отримуватимете червоні повідомлення щоразу, коли на них написано stderr.
Клінтон Блекмор


9

Я просто придумав божевільний метод із залученням FIFO.

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

Якщо ви хочете, щоб висновок stderr був окремим, ви можете відкрити дві окремі оболонки і запустити " grep --color . foo" в одній без &, а потім запустити команду в іншій (все ще з " 2>foo). Ви отримаєте stderr в grepодному і stdout в основному.

Це працює тому, що більш жорсткий вихід направляється через FIFO у grep --color, колір за замовчуванням - червоний (принаймні, це для мене). Коли ви закінчите, просто rmFIFO ( rm foo).

Caveat : Я дійсно не впевнений, як це буде обробляти вихідний порядок, вам доведеться перевірити його.


Це досить гладко.
Клінтон Блекмор

7

Так, це можливо. Перегляньте розділ "Зробити 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 отримує STDERR в 1, забарвлює його, а потім міняє його назад. Подумайте тут про потоковий файл 3 як змінну temp.

Виклик досить простий

rse commands

Однак деякі виклики не працюватимуть, як очікувалося; всі застереження представлені на пов'язаній сторінці.

До речі, я думаю, що також можна прийти з рішенням форми

commands | rse 

де rse забарвить вихід.

Я також знайшов цей проект хіліту, який, здається, робить це. Я не пробував цього, але це може бути те, що ви шукаєте.

hilite - це крихітна утиліта, яка виконує вказану команду, виділяючи все, що надруковано на stderr. Він призначений, головним чином, для використання у складах, щоб попередження та помилки залишалися схожими на болісну кліше.

Інші пов'язані проекти:


rse і hilite досить близькі до того, що я хочу.
Клінтон Блекмор

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

Тут є багато відповідей на висвітлення більш жорсткого результату. Я можу додати лише один досить простий - в один ряд, який ви додаєте до команди:

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 у запиті.


Це саме те, що я шукав, дякую!
Ділон

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.