Как сделать, попробуйте и поймать в bash файл? - PullRequest
1 голос
/ 21 января 2020

У меня есть файл оболочки (deploy. sh), выполняющий следующие команды:

  npm run build:prod

  docker-compose -f .docker/docker-compose.ecr.yml build my-app

  docker-compose -f .docker/docker-compose.ecr.yml push my-app

  aws ecs update-service --cluster ...

Я хочу остановить выполнение bash, когда произошла ошибка одной из команд.

Какая команда это делает в оболочке?

Ответы [ 3 ]

3 голосов
/ 21 января 2020

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

|| обработчик

npm run build:prod || exit 1

если условие

if docker-compose -f .docker/docker-compose.ecr.yml build my-app; then
  printf "success\n"
else
  printf "failure\n"
  exit 1
fi

the $? переменная

docker-compose -f .docker/docker-compose.ecr.yml push my-app
if [ $? -gt 0 ]; then
  printf "Failure\n"
  exit 1
fi

traps

err_report() {
    echo "Error on line $1"
}
trap 'err_report $LINENO' ERR

aws ecs update-service --cluster ...

set -e

Чтобы глобально «выйти из ошибки», тогда set -e сделает именно это. Он не даст вам много информации, но сделает работу.

2 голосов
/ 21 января 2020

Вы можете использовать set -e для выхода из ошибок. И что еще лучше, вы можете set -e и использовать функцию прерывания.

  #!/bin/bash
  set -e
  trap 'catch $? $LINENO' EXIT
  catch() {
   echo "catching!"
   if [ "$1" != "0" ]; then
     # error handling goes here
     echo "Error $1 occurred on $2"
   fi
  }

  npm run build:prod

  docker-compose -f .docker/docker-compose.ecr.yml build my-app

  docker-compose -f .docker/docker-compose.ecr.yml push my-app

  aws ecs update-service --cluster ...

source: https://medium.com/@dirk.avery / the- bash -trap-trap-ce6083f36700

1 голос
/ 21 января 2020

Сделал быстрый поиск в Google, и, кажется, нет. Лучше всего использовать && или || или if ... else блоки, см. Ссылки ниже:

SO-Try Catch in bash и Linuxhint

Надеюсь, это поможет

...