Beri bash i ebash / Говнокод #25985 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
set -e

myfunc() {
  echo "START"
  v=$(asdasdsd 1 2 3)
  echo "FINISH"
}

myfunc && echo "OK"

Выводит:

START
./b.sh: line 5: asdasdsd: command not found
FINISH
OK

asdasdsd - несуществующая команда, вызывающая падение скрипта

Помогите сделать так, чтобы ошибку можно было поймать, и чтобы до echo "FINISH" не доходило.
Уже всё перепробовал. Нерабочие вореанты просьба не предлагать.



Вот так работает правильно
set -e

myfunc() {
  echo "START"
  v=$(asdasdsd 1 2 3)
  echo "FINISH"
}

myfunc


Выводит:
START
./a.sh: line 5: asdasdsd: command not found

Но мне нужно ошибку перехватить.

Запостил: guestinxo guestinxo, (Updated )

Комментарии (23) RSS

  • #SEO Тред отсоса прыщеблядей
    Ответить
    • На земной земле я больше не хожу.
      Я слышу, как ветры говорят:
      "В вечный сон"
      Вот где это кончается...
      В смерти я живу...
      Через вечность к вечному покою...
      Глубоко в неизвестность...
      На земле я просто гость...
      "В вечный сон"
      Ответить
  • #!/bin/sh
    set -e
    
    COMMAND="asdasd"
    
    myfunc() {
    	echo "START"
    	v=$($COMMAND 1 2 3) || return
    	echo "FINISH"
    }
    
    myfunc && echo "OK"
    Ответить
    • myfunc - произвольная функция, её трогать нельзя. Нужно сделать правильный её вызов.
      Ответить
      • падает не функция, а $().
        сама функция написана криво.

        Ты или проверяешь результат (тогда будет финиш) ил не проверяешь (и тогда все упадет) или правишь сому функцию

        или береш нормальынй ЯП (питон, перл, руби)
        Ответить
        • Мне нужен обычный try catch, вмето того, чтобы во всех местах $() оборачивать в return. Неужели так нельзя сделать? А без -e оно какого-то хера после ошибки дальше продолжает.
          Ответить
          • $() это вызов внешней команды.
            Команда вернула -1. Зачем падать? Все логично, что дальше продолжается работа.
            Зачем тебе $(), кстати?

            А вот set -e включает падение в случе ошибки во всех запускаемых коммандах тоже

            try catch в sh нет (и вероятно в баш -- тоже).
            Ответить
            • Ещё раз. У меня есть много кода на баше, который написан с учетом, что опция -e включена (то есть в случае спецэффекта выше могут происходить неконтроллируемые вещи, грубо говоря "rm -rf /$(get_folder)"), переписать я его не могу. Мне нужно вызвать функцию, и проифать упала/не упала.

              > try catch в sh нет (и вероятно в баш -- тоже).

              Как это нет, если есть
              hui && "OK" || "FAIL"
              Ответить
              • эксепшен поднимается по стеку, и его можно поймать где-то наверху.

                В твоем случае ты не можешь поймать то, что вылетело из дебрей hui, если hui это явно не прокинул
                Ответить
              • >rm -rf /$(get_folder)
                обрабатывай ошибки по человечески, или возьми язык с исключениями или монадами с результатом.

                В си ты тоже не можешь обработать такую ситуацию
                Ответить
  • set -e убивает скрипт только если ошибочный статус не был проверен (поставил тебе $? в не-ноль, проверь). У тебя в примере && служит проверкой
    Ответить
      • я тебе написал как не убивать скрипт

        если хочешь вернуть шибку в $?, то вероятно die
        Ответить
    • > У тебя в примере && служит проверкой

      Так что делать то?
      Ответить
  • бамп отсосу прыщеблядей
    Ответить
  • А я вроде придумал:

    set -e
    
    myfunc() {
      echo "START"
      v=$(asdasdsd 1 2 3)
      echo "FINISH"
    }
    
    pryscheblyadi_sosnuli() {
        local exit_status="$?"
        echo "pryscheblyadi_sosnuli $exit_status"
    }
    
    trap pryscheblyadi_sosnuli EXIT
    myfunc
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8