1. bash / Говнокод #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, 22 Октября 2019

    Комментарии (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
          Ответить
      • > У тебя в примере && служит проверкой

        Так что делать то?
        Ответить
    • Какой анскилл!
      Ответить
    • Возьми Tcl
      proc myfunc {} {
          puts START
          set v [asdasdsd 1 2 3]
          puts FINISH
      }
      
      if [catch myfunc errorMsg] {
          puts $errorMsg\n
          puts $errorCode\n
          puts $errorInfo\n
      }
      https://ideone.com/y21OVo
      Ответить
    • бамп отсосу прыщеблядей
      Ответить
    • А я вроде придумал:

      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
      Ответить
      • https://static.businessinsider.com/image/5806276edd089588488b4863-/image.jpg
        Ответить

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