В perl вы можете выйти с сообщением об ошибке с помощью die "some msg"
. Есть ли эквивалентная одна команда в bash? Прямо сейчас я достигаю этого с помощью команд: echo "some msg" && exit 1
В bash существует ли эквивалент die "error msg"
Ответ 1
Вы можете легко свернуть самостоятельно:
die() { echo "$*" 1>&2 ; exit 1; }
...
die "Kaboom"
Ответ 2
Вот что я использую. Он слишком мал, чтобы помещать библиотеку, поэтому я должен был набирать ее сотни раз...
warn () {
echo "$0:" "[email protected]" >&2
}
die () {
rc=$1
shift
warn "[email protected]"
exit $rc
}
Использование: die 127 "Syntax error"
Ответ 3
Это очень близкая функция для perl "die" (но с именем функции):
function die
{
local message=$1
[ -z "$message" ] && message="Died"
echo "$message at ${BASH_SOURCE[1]}:${FUNCNAME[1]} line ${BASH_LINENO[0]}." >&2
exit 1
}
И bash способ угасать, если функция сборки не удалась (с именем функции)
function die
{
local message=$1
[ -z "$message" ] && message="Died"
echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: ${FUNCNAME[1]}: $message." >&2
exit 1
}
Итак, bash хранит всю необходимую информацию в нескольких переменных среды:
- LINENO - текущий номер строки выполнения
- FUNCNAME - стек вызовов функций, первый элемент (индекс 0) - текущая функция, вторая (индекс 1) - это функция, которая вызывает текущую функцию
- BASH_LINENO - вызов стека строк, где было вызвано соответствующее имя FUNCNAME
- BASH_SOURCE - массив исходного файла, в котором сохраняется соответствие FUNCNAME
Ответ 4
Да, это в значительной степени, как вы это делаете.
Вы можете использовать точку с запятой или новую строку вместо & &, так как вы хотите выйти из того, успешно или нет echo (хотя я не уверен, что бы это случилось).
Программирование в оболочке означает использование большого количества небольших команд (некоторые встроенные команды, некоторые крошечные программы), которые хорошо справляются и соединяют их с перенаправлением файлов, логикой выхода кода и другим клеем.
Может показаться странным, если вы привыкли к языкам, где все делается с помощью функций или методов, но вы привыкаете к нему.
Ответ 5
# echo pass params and print them to a log file
wlog(){
# check terminal if exists echo
test -t 1 && echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*"
# check LogFile and
test -z $LogFile || {
echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*" >> $LogFile
} #eof test
}
# eof function wlog
# exit with passed status and message
Exit(){
ExitStatus=0
case $1 in
[0-9]) ExitStatus="$1"; shift 1;;
esac
Msg="$*"
test "$ExitStatus" = "0" || Msg=" ERROR: $Msg : [email protected]"
wlog " $Msg"
exit $ExitStatus
}
#eof function Exit