Как остановить функцию bash при ошибке при вызове с операторами оболочки & amp; & amp; или ||

Ссылка Лиама выглядит великолепно, но также проверить pandas.Timedelta - похоже, что она прекрасно сочетается с дельтами времени NumPy и Python.

https://pandas.pydata.org/pandas- docs / stable / timedeltas.html

pd.date_range('2014-01-01', periods=10) + pd.Timedelta(days=1)

-1
задан B. Baron 16 January 2019 в 10:48
поделиться

2 ответа

Если вы используете set -e, вы должны быть осторожны как внутри, так и снаружи.

С помощью set -e оболочка в основном переводит

foo || bar

в

(set +e; foo) || bar

именно потому, что она должна видеть код выхода с конца функции.

Исправление должно быть таким же осторожным в определении функции.

# Renamed the function to as to avoid shadowing the test built-in
nst () {
    false || return
    echo "This should not be printed!"
}
0
ответ дан tripleee 16 January 2019 в 10:48
поделиться

Взгляните на справочную страницу bash. В нем говорится о set -e (выделено мной):

Выйти немедленно, если конвейер (который может состоять из одной простой команды), список или составная команда (см. ОБРАЗЕЦ ОБОЛОЧКИ выше) , выходит с ненулевым статусом. Оболочка не завершает работу, если команда, которая завершается с ошибкой, является частью части списка команд, следующих сразу за ключевым словом некоторое время или до, часть теста, следующей за зарезервированными словами if или elif, часть любой выполненной команды в & amp; & amp; или || список, за исключением команды, следующей за последней & amp; & amp; или || , любая команда в конвейере, кроме последней, или если возвращаемое значение команды инвертируется с помощью!. Если составная команда, отличная от подоболочки, возвращает ненулевое состояние из-за того, что команда завершилась неудачно, а -e игнорировалась, оболочка не завершится. Ловушка ERR, если установлена, выполняется до выхода из оболочки. Этот параметр применяется к среде оболочки и к каждой среде подоболочки отдельно (см. Выше КОМАНДА ИСПОЛНЕНИЯ ИСПОЛНЕНИЯ) и может привести к выходу подоболочек после выполнения всех команд в подоболочке.

Если составная команда или функция оболочки выполняется в контексте, где -e игнорируется, ни одна из команд, выполняемых в составной команде или теле функции, не будет затронута параметром -e, даже если установлен -e и Команда возвращает статус ошибки. Если составная команда или функция оболочки задает -e при выполнении в контексте, где -e игнорируется, эта настройка не будет иметь никакого эффекта до тех пор, пока составная команда или команда, содержащая вызов функции, не завершится.

В следующем примере второй вызов функции test завершит выполнение сценария, так как это последняя команда в списке ||.

#!/bin/bash

set -e

test()
{
    false
    echo "This should not be printed!"
}

test || echo "test failed"
false || test
echo "Will not be printed"
0
ответ дан Ralf 16 January 2019 в 10:48
поделиться
Другие вопросы по тегам:

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