Сразу скажите, которые производят, был отправлен в stderr

При автоматизации задачи разумно протестировать его сначала вручную. Было бы полезно, тем не менее, если бы какие-либо данные, идущие в stderr, сразу были recognizeable как таковой, и различимый от данных, идущих в 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 разбирается в порядке, но появляется к colourize все после stderr строки. ind жаловался на мой stdin и stderr строки, и затем помещал вывод от stderr в последний раз.

Большинство этих решений осуществимо, поскольку это не нетипично, чтобы только последний вывод перешел к stderr, но тем не менее, было бы хорошо иметь что-то, что работало немного лучше.

8
задан 08.04.2010, 01:34

3 ответа

Я просто разработал сумасшедший метод, включающий FIFOs.

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

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

Это работает, потому что вывод stderr направляется через FIFO в grep --color, чей цвет по умолчанию является красным (по крайней мере, это для меня). Когда Вы сделаны, просто rm FIFO (rm foo).

Протест: я действительно не уверен, как это обработает выходной порядок, необходимо будет проверить его.

9
ответ дан 07.12.2019, 13:46

Да, это возможно. Посмотрите на раздел "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 будет colorize вывод.

Я также нашел этот hilite проект, который, кажется, делает это. Я не испытал его, но это могло бы быть тем, что Вы ищете.

hilite является крошечной утилитой, которая выполняет команду, которую Вы указываете, выделяя что-либо распечатанное к stderr. Это разработано главным образом для использования со сборками, для создания предупреждений, и ошибки терпят как воспаленное клише.

Другие связанные проекты:

7
ответ дан 07.12.2019, 13:46

Другая программа является ind:

http://www.habets.pp.se/synscan/programs.php? prog=ind (необходимо собрать гиперссылку сами, у меня нет достаточного количества точек больше чем для одного на ответ). Существует снимок экрана и даже скринкаст там.

Это выполняет подпроцесс в имуществе, которое другие, вероятно, не делают. Это может иметь значение, где порядок имеет значение (он часто делает), так как stderr сразу сбрасывается в терминалах, и stdout полностью буферизуется, когда это не tty.

Для полного объяснения посмотрите это: http://blog.habets.pp.se/2008/06/Buffering-in-pipes

Кроме того, ind работает с интерактивными программами и управляющими символами. Работы Bash точно так же, как нормальный при запуске с "ind колотят-i".

Это могло работать для предоставления, Вы окрашиваете при сохранении Ctrl-P et.al.

ind -P $(echo -ne '\033[31;1m') -p $(echo -ne '\033[0m') bash -i
1
ответ дан 07.12.2019, 13:46

Теги

Похожие вопросы