Как я могу заставить свой сценарий оболочки отвечать на меня тем, что скрипт, который он вызывает, провалился?Вызов сценария из сценария
#!/bin/sh
test="/Applications/test.sh"
sh $test
exit 0
exit 1
Как я могу заставить свой сценарий оболочки отвечать на меня тем, что скрипт, который он вызывает, провалился?Вызов сценария из сценария
#!/bin/sh
test="/Applications/test.sh"
sh $test
exit 0
exit 1
я обычно беру следующий подход:
#!/usr/bin/env bash
test="/Applications/test.sh"
sh "${test}"
exit_status=$?
if [[ ${exit_status} ]] ; then
echo "Error: ${test} failed with status ${exit_status}." >&2
else
echo "Success!"
fi
+1, но с использованием '[[' будет выходить, если '/ bin/sh' - примитивная оболочка (например, не' bash'). Безопаснее делать: 'if! test $ exit_status = 0; затем'. Кроме того, сообщение об ошибке должно быть, вероятно, направлено на stderr. –
@WilliamPursell: Хорошие очки. Я обновил сценарий. – Johnsyweb
'$?' Часто используется как в этом сообщении noobs, потому что они не понимают 'if true; тогда ...; еще ...; fi' –
#!/bin/sh
if sh /Applications/test.sh; then
echo "Well done $USER"
exit 0
else
echo "script failed with code [$?]" >&2
exit 1
fi
/Applications/test.sh
сценарий должен быть хорошо закодированы для выхода с обычным статусом. 0
если это нормально и > 0
если он не работает.
Как вы можете видеть, нет необходимости проверять специальную переменную $?
, мы напрямую используем boolean expression.
С точки зрения наилучшей практики, вы не должны. Если сбой сценария, он должен выпустить сообщение об ошибке до того, как оно завершится, так что его родитель не должен. Основная причина этого заключается в том, что процесс знает, почему он терпит неудачу, а родитель может только догадываться. Другими словами, вы должны просто написать:
#!/bin/sh
test="/Applications/test.sh"
sh $test
Хотя на самом деле, это было бы более типично просто написать:
#!/bin/sh
/Applications/test.sh
test.sh
издаст необходимое сообщение об ошибке, и сценарий будет возвращать то же самое как и test.sh
. Кроме того, в его нынешнем виде ваш скрипт всегда будет успешным, даже если test.sh
действительно потерпел неудачу, потому что exit 0; exit 1
довольно бессмысленно: exit 1
никогда не будет вызван.
К сожалению, не все сторонние скрипты так хорошо себя ведут, и иногда их необходимо обернуть. – Johnsyweb
Да, и я думаю, это то, чего хочет OP сейчас. –
Выполняет ли 'test.sh' соглашение о возврате 0 на успех и отличное от нуля? – Johnsyweb
да, это test.sh также имеет выход 0 выход 1 – user1938745
Только первый «выход» сделал бы что-нибудь в вашем примере; второй никогда не достигается, потому что вы уже вышли с первым. – chepner