Проверка выполнения предыдущей команды

Не нужно так фантазировать; вы можете наблюдать тот же эффект при

{ echo 'foo' ; sleep 10 ; } | grep oo | grep oo

,

{ echo 'foo' ; sleep 10 ; } | grep oo | cat

или

  • Открыть две клеммы. Перейдите в один и тот же каталог в обоих (например, ваш домашний каталог или /tmp).
  • В одном do { echo 'foo' ; спать 10 ; } | grep oo > foo.out.
  • В другом случае повторите ls -ld foo.out.
    Вы увидите, что файл foo.outпоявится сразу, но имеет размер 0 в течение десяти секунд, после чего становится равным 4 байтам.

Просто: grepпроверяет, является ли его (стандартный) вывод терминалом. Если это так, он записывает вывод так же быстро, как он имеет вывод для записи. Если это не так, он буферизует свой вывод и записывает N  байт за раз, где N  обычно равно 512, но может отличаться в некоторых реализациях.

0
20.04.2019, 18:10
1 ответ

Утилита expdpзавершает работу с нулевым статусом выхода, если

The export or import job completed successfully. No errors are displayed to the output device or recorded in the log file, if there is one. [Ref: Data Pump Exit Codes].

В противном случае он будет иметь ненулевой -статус выхода. Это стандарт для утилит в Unix. Ноль означает «Успех», а также является «истинным» значением в логических тестах.

Таким образом, в вашем сценарии вы должны иметь возможность сказать

if expdp...other options...; then
   echo 'Success'
else
   echo 'Failure'
fi

Это означает, что вы получили тесты в своем коде задом наперед.

Если вы действительно хотите отобразить код выхода:

expdp...other options...
code=$?

echo "Exit code is $code"

if [ "$code" -eq 0 ]; then
   echo 'Success'
else
   echo 'Failure'
fi

Поскольку echoзаменит $?, вам нужно будет сохранить его значение в новую переменную сразу после использования expdp.

3
28.01.2020, 02:33

Теги

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