В bash есть эквивалент die "error msg" - PullRequest
63 голосов
/ 24 октября 2011

В Perl вы можете выйти с ошибкой msg с die "some msg". Есть ли в bash эквивалентная команда? Прямо сейчас я добиваюсь этого с помощью команд: echo "some msg" && exit 1

Ответы [ 5 ]

69 голосов
/ 24 октября 2011

Вы можете бросить свой собственный достаточно легко:

die() { echo "$*" 1>&2 ; exit 1; }
...
die "Kaboom"
25 голосов
/ 24 октября 2011

Вот что я использую.Она слишком мала, чтобы поместить ее в библиотеку, поэтому я, наверное, набирал ее сотни раз ...

warn () {
    echo "$0:" "$@" >&2
}
die () {
    rc=$1
    shift
    warn "$@"
    exit $rc
}

Использование: die 127 "Syntax error"

11 голосов
/ 17 января 2014

Это очень близкая функция к «die» perl (но с именем функции):

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
3 голосов
/ 24 октября 2011

Да, это в значительной степени, как вы это делаете.

Вы можете использовать точку с запятой или символ новой строки вместо &&, так как хотите выйти независимо от того, успешно ли выполняется эхо (хотя я не уверен, что может привести к сбою).

Программирование в оболочке означает использование множества маленьких команд (некоторые встроенные команды, некоторые крошечные программы), которые хорошо выполняют одну задачу, и связывают их с перенаправлением файлов, логикой кода выхода и другими связками.

Может показаться странным, если вы привыкли к языкам, где все делается с помощью функций или методов, но вы к этому привыкли.

0 голосов
/ 12 мая 2012
# 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 : $@"
    wlog " $Msg"
    exit $ExitStatus
}
#eof function Exit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...