Невозможно выйти из сценария оболочки при использовании команды exe c - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть один основной сценарий (deploy_test. sh), который просматривает файлы с помощью команды find и выполняет несколько других сценариев оболочки. Основной сценарий не завершается, даже если в другой оболочке происходит сбой. Я использовал несколько опций в начале скрипта, но я все еще не могу выйти, и скрипт продолжается до конца.

deploy_test. sh

#!/usr/bin/env bash
set -euo pipefail
shopt -s execfail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"


echo "Do you want to Continue: [Yes/No]"

read action

if [ $action = "Yes" ]
then


 echo "Executing scripts"
 find ${SCRIPT_DIR}/folder2 -type f -name '*.sh' -exec bash {} \;
 echo $?
 echo "This should also not be printed"


else
echo "nothing"
exit 1
fi

В моей папке 2 2. sh файлы (1. sh и 2. sh)

1. sh (содержат специальные символы в конце скрипта)

#!/usr/bin/env bash -eu

echo "hi iam in 1.sh and i have error in this file"
`

2. sh

#!/usr/bin/env bash -eu

echo "hi iam in 2.sh and i have no error in this file"

Результат при выполнении скрипта

(deploy) CSI-0048:test_test smullangi$ ./deploy_test.sh
Do you want to Continue: [Yes/No]
Yes
Executing scripts
hi iam in 1.sh and i have error in this file
/Users/smullangi/Desktop/test_test/folder2/1.sh: line 4: unexpected EOF while looking for matching ``'
/Users/smullangi/Desktop/test_test/folder2/1.sh: line 5: syntax error: unexpected end of file
hi iam in 2.sh and i have no error in this file
0
This should also not be printed

Я ожидал, что этот скрипт завершится после ошибки в файле 1. sh, который имел специальный символ. Но какие бы варианты я ни пробовал, скрипт не завершает работу после ошибки.

Любая помощь очень ценится. Я выполняю это на macbook (macos catalina v10.15.3) с bash версией (3.2.57 (1) -релиз)

# ОБНОВЛЕНИЕ1:

Также Я чувствую, что скрипт не выполняется вообще. Если в скрипте нет ошибок, он также завершается. Короче говоря, я чувствую, что мои скрипты в folder1 / folder2 не выполняются после модификации кода согласно советам Филиппа

#!/usr/bin/env bash
set -euo pipefail
shopt -s execfail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"


echo "Do you want to Continue: [Yes/No]"

read action

if [ $action = "Yes" ]
then


 echo "Executing scripts"
 find ${SCRIPT_DIR}/folder2 -type f -name '*.sh' -exec false bash {} +
 #find ${SCRIPT_DIR}/folder2 -type f -name '*.sh' -exec bash {} \;
 echo $?
 echo "This should also not be printed"


else
echo "nothing"
exit 1
fi

Вывод

(deploy) CSI-0048:test_test smullangi$ ./deploy_test.sh 
Do you want to Continue: [Yes/No]
Yes
Executing scripts

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

find не всегда завершается с кодом ошибки, когда выполняемые им команды выдают ошибку:

find ${SCRIPT_DIR}/folder1 -type f -exec false {} \;

Выше find сама команда выполняется успешно, даже если каждая выполняемая команда выдает ошибку.

После find выдает ошибку:

find ${SCRIPT_DIR}/folder1 -type f -exec false {} +

Для обработки ошибок каждого скрипта вы можете сделать

cd ${SCRIPT_DIR}/folder1
for script in ./*.sh; do
    $script
done
0 голосов
/ 08 апреля 2020

Я не нашел элегантного решения с использованием exe c. Поэтому я использовал команду xargs в команде find, и она работает отлично. Оболочка выходит с соответствующим сообщением об ошибке. Я использовал это в качестве справки https://unix.stackexchange.com/questions/571215/force-xargs-to-stop-on-first-command-error

#!/usr/bin/env bash
set -euo pipefail
shopt -s execfail

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"


echo "Do you want to Continue: [Yes/No]"

read action

if [ $action = "Yes" ]
then


 echo "Executing scripts"
 find ${SCRIPT_DIR}/folder2 -type f -name '*.sh' | xargs -I {} sh -c 'bash "$1" || exit 255' sh {}
 echo $?
 echo "This should also not be printed"


else
echo "nothing"
exit 1
fi
...