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

StackOverflow https://stackoverflow.com//questions/25064292

  •  23-12-2019
  •  | 
  •  

Вопрос

Можно ли распространить код выхода к абонеру в случае синтаксической ошибки в скрипте Bash с выходом?Например, если у меня есть:

#! /bin/bash

set -eu

trap "echo dying!!" EXIT

echo yeah
echo $UNBOUND_VARIABLE
echo boo
.

Затем запустить его, дает код выхода 0, даже если сценарий не совсем не закончился:

$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!

$ echo $?
0
.

Но если я прокомментирую выходную ловушку, скрипт возвращается 1. В качестве альтернативы, если я заменил строку с несвязной переменной с помощью команды, которая возвращает ненулевой (например, /bin/false), что значение выхода распространяется, когда я хотел бы,

Это было полезно?

Решение 2

Это поведение связано с различными версиями Bash.Оригинальный сценарий работает, как ожидалось, на Bash 4.2, но не на 3.2.Наличие прерымонов ошибок в отдельном файле скрипта и запущена его в подмененном подселении, работает вокруг проблем в более ранних версиях Bash:

#!/bin/bash

$BASH sub.sh
RETVAL=$?

if [[ "$RETVAL" != "0" ]]; then
  echo "Dying!! Exit code: $RETVAL"
fi
.

sub.sh:

set -eu

echo yeah
echo $UNBOUND_VARIABLE
echo boo
.

Другие советы

Оболочка выходит с результатом последней выполненной команды.В вашем случае ловушка это генеракодицетагкод, который обычно возвращается с успехом.

Чтобы распространять вашу ценность, просто генеракодицетагCode с ним.

#!/bin/bash

set -eu

die() {
  echo "Dying!!"
  exit "$1"
}

trap 'die $?' EXIT

echo yeah
echo $unbound
echo boo
.

Также обратите внимание, что echo считается вредным - он заставляет вас думать, что сценарий выйдет, если команда не удалась, которую она не всегда будет делать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top