Я знаю, что есть несколько вопросов SO по exit
против return
в bash
сценариях (например, здесь ).
По этой теме, но отличается от существующих вопросовЯ полагаю, я хотел бы знать, существует ли «наилучшая практика» для безопасной реализации «раннего возврата» из сценария bash
, чтобы текущая оболочка пользователя не закрывалась, если они исходят из сценария.
Ответы, такие как this , кажутся основанными на "exit
", но если сценарий получен, то есть выполняется с префиксом ".
" (точка), сценарий выполняется в контекст текущей оболочки , в этом случае оператор exit
имеет эффект выхода из текущей оболочки.Я предполагаю, что это нежелательный результат, потому что скрипт не знает, был ли он получен или запущен в подоболочке - если первый, пользователь может неожиданно исчезнуть из своей оболочки.Есть ли способ / лучшие практики для раннего возврата, чтобы не выходить из текущей оболочки, если вызывающая сторона получает ее?
Например, этот сценарий ...
#! /usr/bin/bash
# f.sh
func()
{
return 42
}
func
retVal=$?
if [ "${retVal}" -ne 0 ]; then
exit "${retVal}"
# return ${retVal} # Can't do this; I get a "./f.sh: line 13: return: can only `return' from a function or sourced script"
fi
echo "don't wanna reach here"
... работает без убийствамоя текущая оболочка, если она запускается из подоболочки ...
> ./f.sh
>
... но убивает мою текущую оболочку, если она получена:
> . ./f.sh
Одна идея, которая приходит на умзаключается в том, чтобы вкладывать код в coditionals, чтобы не было явного оператора exit
, но мой уклон C
/ C++
заставляет думать о ранних возвратах как эстетически предпочтительном по сравнению с вложенным кодом.Существуют ли другие решения, которые действительно «с ранним возвращением»?