Как я могу передать stderr и все еще проверить, не завершилась ли команда? - PullRequest
0 голосов
/ 23 мая 2019

Я хотел бы написать однострочник для cron, который будет:

  1. Перенаправить STDOUT и STDERR в логгер
  2. Проверить, не выполнена ли команда
  3. Выполнитьдействие, если это произойдет

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

script.sh:

SCRIPT=`basename "$0"`
echo $SCRIPT is running...
\>&2 echo $SCRIPT has failed!
exit 1

Когда я запускаю скрипт без отправки в логгер, все в порядке.Когда я передаю все данные в журнал для последующего просмотра, проверка ошибок завершается неудачей.Есть ли способ заставить одновременно работать конвейер и проверку ошибок?

\>script.sh
script.sh is running...
script.sh failed!

\>script.sh || echo foo
script.sh is running...
script.sh failed!
foo

\>script.sh 2>&1 | logger || echo foo
\>

1 Ответ

0 голосов
/ 23 мая 2019

В одну сторону:

set -o pipefail
script.sh |& logger || echo foo

Другой способ:

(script.sh |& logger; exit ${PIPESTATUS[0]}) || echo foo

См. man bash:

PIPESTATUS Переменная массива, содержащая список значений состояния выхода из процессов в самом последнем из выполненных конвейер переднего плана (который может содержать только одну команду).

...