2013-02-25 4 views
2

Как я могу заставить свой сценарий оболочки отвечать на меня тем, что скрипт, который он вызывает, провалился?Вызов сценария из сценария

#!/bin/sh 

test="/Applications/test.sh" 

sh $test 

exit 0 
exit 1 
+0

Выполняет ли 'test.sh' соглашение о возврате 0 на успех и отличное от нуля? – Johnsyweb

+0

да, это test.sh также имеет выход 0 выход 1 – user1938745

+0

Только первый «выход» сделал бы что-нибудь в вашем примере; второй никогда не достигается, потому что вы уже вышли с первым. – chepner

ответ

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

+1, но с использованием '[[' будет выходить, если '/ bin/sh' - примитивная оболочка (например, не' bash'). Безопаснее делать: 'if! test $ exit_status = 0; затем'. Кроме того, сообщение об ошибке должно быть, вероятно, направлено на stderr. –

+0

@WilliamPursell: Хорошие очки. Я обновил сценарий. – Johnsyweb

+0

'$?' Часто используется как в этом сообщении noobs, потому что они не понимают 'if true; тогда ...; еще ...; fi' –

3
#!/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.

0

С точки зрения наилучшей практики, вы не должны. Если сбой сценария, он должен выпустить сообщение об ошибке до того, как оно завершится, так что его родитель не должен. Основная причина этого заключается в том, что процесс знает, почему он терпит неудачу, а родитель может только догадываться. Другими словами, вы должны просто написать:

#!/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 никогда не будет вызван.

+0

К сожалению, не все сторонние скрипты так хорошо себя ведут, и иногда их необходимо обернуть. – Johnsyweb

+1

Да, и я думаю, это то, чего хочет OP сейчас. –

Смежные вопросы