оболочка posix: stdout в файл, код выхода для переменной и последняя строка stderr для другой переменной

Я реализовал в оболочке POSIX (не bash) следующее:

fail.sh:

#!/bin/sh
echo something useful
echo warning 1 >&2
echo warning 2 >&2
echo an error message >&2
exit 100

Команда выводит то, что я хочу использовать на stdout, некоторые предупреждения на stderr и сообщение об ошибке на stderr, прежде чем сбой с кодом выхода 100.

success.sh:

#!/bin/sh
echo something useful
echo warning 1 >&2
echo warning 2 >&2
exit 0

Эта команда выводит что-то в stdout и некоторые предупреждения в stderr, но успешно завершается с кодом выхода 0.

test.sh:

#!/bin/sh -e

script=$1
rm -f success
msg=$({ $script > useful; touch success; } 2>&1 | tail -1;)

if [ -f success ]; then
        echo success
else    
        echo failure
        echo last error was: $msg
fi

В этом сценарии я хочу запустить любой из этих двух сценариев и предоставить следующие функции:

  • вывод скриптов должен быть перенаправлен в файл
  • последняя строка stderr должна быть сохранена в переменной, чтобы я мог распечатать эту последнюю строку позже, если команда не завершилась успешно
  • Я хочу определить, успешно ли завершилась команда, проверив ее статус выхода.

Мой скрипт test.sh достигает всего этого, но использует внешний файл. Поскольку я использую -e, touch будет выполняться только в том случае, если $script выполнено успешно. Могу ли я записать код выхода $script без этой техники?

Сценарий должен быть написан в оболочке POSIX и должен использовать -e.


person josch    schedule 24.05.2013    source источник
comment
Почему он должен использовать -e? Это соревнование по программированию или домашнее задание?   -  person Barmar    schedule 24.05.2013
comment
@Barmar тоже - это дополнение к существующему сценарию оболочки, автор которого настаивает на использовании -e   -  person josch    schedule 24.05.2013


Ответы (1)


person    schedule
comment
ты наверное имел ввиду msg=$({ $script > useful; } 2>&1);? - person josch; 24.05.2013
comment
Нет, я не считаю такой формат необходимым, поэтому переписал его в более простой форме. Перенаправления реализованы слева направо, так что это эквивалентно. - person Barmar; 24.05.2013
comment
но с этим useful также содержит вывод stderr - person josch; 24.05.2013
comment
Я только что пробовал ./fail.sh 2>&1 >useful и useful содержал только something useful. - person Barmar; 24.05.2013
comment
извините, моя ошибка - перепутала заказ - огромное спасибо за помощь! Я не знал, что так можно сделать! - person josch; 24.05.2013