Ловля кодов ошибок в канале оболочки

Вы аспирант, звучит как хорошая тема для исследовательского гранта для меня. Посмотрите на дизайн FPGA и компьютерную архитектуру. Существует множество бесплатных проектов процессоров, доступных на http://www.opencores.org/

Сборка мусора может быть реализована как фоновая задача, она уже предназначен для параллельной работы.

Пит

91
задан codeforester 27 August 2018 в 03:26
поделиться

1 ответ

Если вы действительно не хотите, чтобы вторая команда продолжалась до тех пор, пока первая не станет успешной, то вам, вероятно, придется использовать временные файлы. Вот простая версия:

tmp=${TMPDIR:-/tmp}/mine.$$
if ./a > $tmp.1
then
    if ./b <$tmp.1 >$tmp.2
    then
        if ./c <$tmp.2
        then : OK
        else echo "./c failed" 1>&2
        fi
    else echo "./b failed" 1>&2
    fi
else echo "./a failed" 1>&2
fi
rm -f $tmp.[12]

Перенаправление «1> & 2» также может быть сокращено «> & 2»; однако старая версия оболочки MKS неправильно обрабатывала перенаправление ошибок без предшествующей «1», поэтому я использовал эту однозначную нотацию для надежности целую вечность.

Это приводит к утечке файлов, если вы что-то прерываете. При программировании оболочки с защитой от взлома (более или менее) используется:

tmp=${TMPDIR:-/tmp}/mine.$$
trap 'rm -f $tmp.[12]; exit 1' 0 1 2 3 13 15
...if statement as before...
rm -f $tmp.[12]
trap 0 1 2 3 13 15

В первой строке прерывания говорится: «выполнить команды» rm -f $ tmp. [12]; exit 1 'при возникновении любого из сигналов 1 SIGHUP, 2 SIGINT, 3 SIGQUIT, 13 SIGPIPE или 15 SIGTERM, или 0 (когда оболочка завершает работу по любой причине). Если вы хотите, чтобы вторая команда продолжалась до тех пор, пока первая не станет успешной, тогда вам, вероятно, придется использовать временные файлы. Вот простая версия:

tmp=${TMPDIR:-/tmp}/mine.$$
if ./a > $tmp.1
then
    if ./b <$tmp.1 >$tmp.2
    then
        if ./c <$tmp.2
        then : OK
        else echo "./c failed" 1>&2
        fi
    else echo "./b failed" 1>&2
    fi
else echo "./a failed" 1>&2
fi
rm -f $tmp.[12]

Перенаправление «1> & 2» также может быть сокращено «> & 2»; однако старая версия оболочки MKS неправильно обрабатывала перенаправление ошибок без предшествующей «1», поэтому я использовал эту однозначную нотацию для надежности целую вечность.

Это приводит к утечке файлов, если вы что-то прерываете. При программировании оболочки с защитой от взлома (более или менее) используется:

tmp=${TMPDIR:-/tmp}/mine.$$
trap 'rm -f $tmp.[12]; exit 1' 0 1 2 3 13 15
...if statement as before...
rm -f $tmp.[12]
trap 0 1 2 3 13 15

В первой строке прерывания написано «выполнить команды» rm -f $ tmp. [12]; exit 1 'при возникновении любого из сигналов 1 SIGHUP, 2 SIGINT, 3 SIGQUIT, 13 SIGPIPE или 15 SIGTERM, или 0 (когда оболочка завершает работу по любой причине). Если вы хотите, чтобы вторая команда продолжалась до тех пор, пока первая не станет успешной, тогда вам, вероятно, придется использовать временные файлы. Вот простая версия:

tmp=${TMPDIR:-/tmp}/mine.$$
if ./a > $tmp.1
then
    if ./b <$tmp.1 >$tmp.2
    then
        if ./c <$tmp.2
        then : OK
        else echo "./c failed" 1>&2
        fi
    else echo "./b failed" 1>&2
    fi
else echo "./a failed" 1>&2
fi
rm -f $tmp.[12]

Перенаправление «1> & 2» также может быть сокращено «> & 2»; однако старая версия оболочки MKS неправильно обрабатывала перенаправление ошибок без предшествующей «1», поэтому я использовал эту однозначную нотацию для надежности целую вечность.

Это приводит к утечке файлов, если вы что-то прерываете. При программировании оболочки с защитой от взлома (более или менее) используется:

tmp=${TMPDIR:-/tmp}/mine.$$
trap 'rm -f $tmp.[12]; exit 1' 0 1 2 3 13 15
...if statement as before...
rm -f $tmp.[12]
trap 0 1 2 3 13 15

В первой строке прерывания говорится: «выполнить команды» rm -f $ tmp. [12]; exit 1 'при возникновении любого из сигналов 1 SIGHUP, 2 SIGINT, 3 SIGQUIT, 13 SIGPIPE или 15 SIGTERM, или 0 (когда оболочка завершает работу по любой причине). тогда вам, вероятно, потребуется использовать временные файлы. Вот простая версия:

tmp=${TMPDIR:-/tmp}/mine.$$
if ./a > $tmp.1
then
    if ./b <$tmp.1 >$tmp.2
    then
        if ./c <$tmp.2
        then : OK
        else echo "./c failed" 1>&2
        fi
    else echo "./b failed" 1>&2
    fi
else echo "./a failed" 1>&2
fi
rm -f $tmp.[12]

Перенаправление «1> & 2» также может быть сокращено «> & 2»; однако старая версия оболочки MKS неправильно обрабатывала перенаправление ошибок без предшествующей «1», поэтому я использовал эту однозначную нотацию для надежности целую вечность.

Это приводит к утечке файлов, если вы что-то прерываете. При программировании оболочки с защитой от взлома (более или менее) используется:

tmp=${TMPDIR:-/tmp}/mine.$$
trap 'rm -f $tmp.[12]; exit 1' 0 1 2 3 13 15
...if statement as before...
rm -f $tmp.[12]
trap 0 1 2 3 13 15

В первой строке прерывания говорится: «выполнить команды» rm -f $ tmp. [12]; exit 1 'при возникновении любого из сигналов 1 SIGHUP, 2 SIGINT, 3 SIGQUIT, 13 SIGPIPE или 15 SIGTERM, или 0 (когда оболочка завершает работу по любой причине). тогда вам, вероятно, потребуется использовать временные файлы. Вот простая версия:

tmp=${TMPDIR:-/tmp}/mine.$$
if ./a > $tmp.1
then
    if ./b <$tmp.1 >$tmp.2
    then
        if ./c <$tmp.2
        then : OK
        else echo "./c failed" 1>&2
        fi
    else echo "./b failed" 1>&2
    fi
else echo "./a failed" 1>&2
fi
rm -f $tmp.[12]

Перенаправление «1> & 2» также может быть сокращено «> & 2»; однако старая версия оболочки MKS неправильно обрабатывала перенаправление ошибок без предшествующей «1», поэтому я использовал эту однозначную нотацию для надежности целую вечность.

Это приводит к утечке файлов, если вы что-то прерываете. При программировании оболочки с защитой от взлома (более или менее) используется:

tmp=${TMPDIR:-/tmp}/mine.$$
trap 'rm -f $tmp.[12]; exit 1' 0 1 2 3 13 15
...if statement as before...
rm -f $tmp.[12]
trap 0 1 2 3 13 15

В первой строке прерывания говорится: «выполнить команды» rm -f $ tmp. [12]; exit 1 'при возникновении любого из сигналов 1 SIGHUP, 2 SIGINT, 3 SIGQUIT, 13 SIGPIPE или 15 SIGTERM, или 0 (когда оболочка завершает работу по любой причине). старая версия оболочки MKS неправильно обрабатывала перенаправление ошибок без предшествующей «1», поэтому я использовал эту однозначную нотацию для надежности целую вечность.

Это приводит к утечке файлов, если вы что-то прерываете. При программировании оболочки с защитой от взлома (более или менее) используется:

tmp=${TMPDIR:-/tmp}/mine.$$
trap 'rm -f $tmp.[12]; exit 1' 0 1 2 3 13 15
...if statement as before...
rm -f $tmp.[12]
trap 0 1 2 3 13 15

В первой строке прерывания говорится: «выполнить команды» rm -f $ tmp. [12]; exit 1 'при возникновении любого из сигналов 1 SIGHUP, 2 SIGINT, 3 SIGQUIT, 13 SIGPIPE или 15 SIGTERM, или 0 (когда оболочка завершает работу по любой причине). старая версия оболочки MKS неправильно обрабатывала перенаправление ошибок без предшествующей «1», поэтому я использовал это недвусмысленное обозначение надежности на протяжении многих лет.

Это приводит к утечке файлов, если вы что-то прерываете. При программировании оболочки с защитой от взлома (более или менее) используется:

tmp=${TMPDIR:-/tmp}/mine.$$
trap 'rm -f $tmp.[12]; exit 1' 0 1 2 3 13 15
...if statement as before...
rm -f $tmp.[12]
trap 0 1 2 3 13 15

В первой строке прерывания говорится: «выполнить команды» rm -f $ tmp. [12]; exit 1 'при возникновении любого из сигналов 1 SIGHUP, 2 SIGINT, 3 SIGQUIT, 13 SIGPIPE или 15 SIGTERM, или 0 (когда оболочка завершает работу по любой причине). Если вы пишете сценарий оболочки, последняя ловушка должна удалить только ловушку на 0, которая является ловушкой выхода из оболочки (вы можете оставить другие сигналы на месте, поскольку процесс все равно вот-вот завершится).

В Исходный конвейер, возможно, чтобы 'c' считывал данные из 'b' до того, как 'a' завершился - это обычно желательно (например, это дает работу нескольким ядрам). Если «b» является фазой «сортировки», то это не применимо - «b» должен увидеть весь свой ввод, прежде чем он сможет сгенерировать какой-либо из своих выходных данных.

Если вы хотите определить, какая команда (и) не работает. , вы можете использовать:

(./a || echo "./a exited with $?" 1>&2) |
(./b || echo "./b exited with $?" 1>&2) |
(./c || echo "./c exited with $?" 1>&2)

Это просто и симметрично - тривиально расширить конвейер до 4 или N частей.

Простые эксперименты с 'set -e' не помогли.

19
ответ дан 24 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

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