2012-07-24 2 views
2

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

$ cat test.sh 
#!/bin/bash 

foo(){ 
    [ "$1" ] && echo pass || exit 
} 

read < <(foo 123) 
read < <(foo) 
echo 'SHOULD NOT SEE THIS' 

$ ./test.sh 
SHOULD NOT SEE THIS 

Основываясь на CodeGnome’s answer это похоже на работу

$ cat test.sh 
#!/bin/bash 

foo(){ 
    [ "$1" ] && echo pass || exit 
} 

read < <(foo 123) || exit 
echo 'SHOULD SEE THIS' 
read < <(foo) || exit 
echo 'SHOULD NOT SEE THIS' 

$ ./test.sh 
SHOULD SEE THIS 
+0

Подсказка: ваше построение foo не оценивает, что вы думаете. Как написано, ваша функция foo всегда вернет true. Вероятно, вы хотели, чтобы foo содержал '{test -n" $ 1 "&& echo pass; } || выйдите 1' вместо этого. –

ответ

2

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

Вы также можете проверить статус возврата любой команды или функции напрямую или проверить переменную $?. Например:

foo() { 
    return 1 
} 

foo || { echo "Return status: $?"; exit 1; } 
+1

Строго говоря, '$?' Будет содержать код выхода 'read', а не' foo'. Если важно получить код выхода 'foo', я думаю, вам просто нужно избежать замещения процесса. – chepner

+0

Не работает ли это только потому, что 'read' возвращает ненулевое значение в EOF? Я думаю, что в общем случае замена процесса не приведет к потере родительской команды даже с помощью 'errexit'. –

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