"set -e" и "test" в оболочке - PullRequest
       9

"set -e" и "test" в оболочке

0 голосов
/ 09 января 2019

В сценариях оболочки набор -e часто используется, чтобы сделать их более устойчивыми, останавливая сценарий, когда некоторые команды, выполняемые из сценария, завершаются с ненулевым кодом выхода. Я запутался в командах "set -e" и "test", результат противоречит тому, что я хочу.

#!/bin/bash
set -e
a=10
b=9
#test $a -lt $b && false
#test $a -gt $b && false
echo "111"

Реальный результат: если a > b, ничего не печатать если a < b, выведите 111. но я так не думаю, я думаю, что в результате ничего не произошло.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Если вы хотите выйти, когда a больше b, просто напишите

#!/bin/bash
set -e
a=10
b=9
test $a -le $b
echo "111"

Если test завершится неудачно, set -e приведет к завершению работы скрипта; если это удается, сценарий продолжает echo. Однако есть много подводных камней для использования set -e; Я рекомендую просто сделать свою собственную обработку ошибок.

#!/bin/bash

abort () { printf '%s\n' >&2; exit 1; }
a=10
b=9
test "$a" -le "$b" || abort "$a is greater than $b"
echo "111"
0 голосов
/ 10 января 2019

Спасибо всем, я нашел ответ, который

SHELL Выход немедленно, если конвейер (который может состоять из одной простой команды), список или составная команда (см. ОБРАЗЕЦ ОБОЛОЧКИ выше) выходит с ненулевым статусом. Оболочка не завершает работу, если сбойная команда является частью списка команд, следующих сразу за ключевым словом некоторое время или до, часть теста после зарезервированных слов if или elif, часть любой команды, выполненной в символах && или || список, за исключением команды, следующей за последним символом && или ||, любой команды в конвейере, кроме последней, или если возвращаемое значение команды инвертируется с помощью!.

0 голосов
/ 09 января 2019

То, как вы написали свой скрипт, означает, что он выйдет без печати в любой ситуации, НО, если a и b равны.

Если вы попробуете с a = 9 и b = 9, вы увидите вывод 111.

Вы можете легко все поведение, используя опцию -x GNU / Bash.

Объяснение выхода - использование вами опции -e; Вы можете прочитать это в Руководстве по GNU / Bash :

Немедленно завершите работу, если конвейер (см. Конвейеры), который может состоять из одной простой команды (см. Простые команды), списка (см. Списки) или составной команды (см. Составные команды), возвращает ненулевое состояние. Оболочка не завершает работу, если сбойная команда является частью списка команд, следующих сразу за ключевым словом некоторое время или до, часть теста в операторе if, часть любой команды, выполняемой в && или || список, за исключением команды, следующей за последним символом && или ||, любой команды в конвейере, кроме последней, или если статус возврата команды инвертируется с помощью!. Если составная команда, отличная от подоболочки, возвращает ненулевое состояние из-за сбоя команды, когда -e игнорировалась, оболочка не завершается. Ловушка на ERR, если установлена, выполняется до выхода из оболочки.

Этот параметр применяется к среде оболочки и к каждой среде подоболочки отдельно (см. Среду выполнения команд) и может привести к выходу подоболочек перед выполнением всех команд в подоболочке.

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

...