Подтвердить что ты не робот

В bash существует ли эквивалент die "error msg"

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

4b9b3361

Ответ 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