1. Куча / Говнокод #4970

    +66

    1. 1
    2. 2
    cd TempDir
    del /f /q /s *

    Когда-то давно написал батник для автоматизации каких-то работ по удалению временных файлов. Там были переходы посложнее между папками, чем сдесь, но для илюстрации соли фейла подойдет и это.
    Однажды моё предположение о существовании некоторых папок неоправдалось. И некоторые из комманд типа cd TempDir сфейлили. Естественно, на ошибки результат их выполнения я не проверял и при ерроре не выходил из батника. Запустил я в тот роковой день батник и смотрю - что-то очень долго удаляется директория временных файлов...
    Подскос пошёл весь логический диск с данными. :D
    В результате той комбинации не сфейлевших комманд cd текущем каталогом оказался корневой каталог диска.
    Естественно, батник до наших дней не дошёл, тк был на этом логическом диске и слава богу. :D

    Запостил: Говногость, 18 Декабря 2010

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

    • ухахааххааах
      Вот сдесь бы исключения пригодились.
      Ответить
      • на юнихах, специально для таких случаев, стандартный шелл поддерживает опцию `-e` с которой шелл остановливает исполнение скрипта если команда завершается с не-0 статусом. ну и естественно что из этого можно сделать свои доморощеные исключения:
        (set -e    # try, a subshell
        
        commands
        commands
        commands
        
         ) || {   # catch
          echo "exception!"
          exit 1
        };


        хотя для случая вверху, правильней было бы пользоваться абсоютными путями и выкинуть `cd` полностью.
        Ответить
    • Да, опасная вещь полагаться на текущую директорию.
      А ещё более опасно игнорировать ошибки (как это часто делается по умолчанию в скриптах)

      Выходы (наверняка все знают, но на всякий случай выскажу):
      1) везде явно указывать имя директории, не полагаясь на текущую
      2) после cd делать "&&", или "|| exit"

      Первый способ надежнее, так как при копипасте фрагментов кода текущей директорией может оказаться что угодно=)

      А вообще жутко. И почему по умолчанию строки скрипта не соединяются как через &&, то есть выполнять следующую строку только после успешного выполнения предыдущей? В большинстве случаев именно такое поведение и нужно, а когда нужно игнорировать ошибку, никто не мешает сделать "|| true"
      Ответить
      • >после cd делать "&&", или "|| exit"
        Так можно в батниках? Спасибо! :)
        Ответить
        • Мм... стоит проверить, я на .bat почти не писал, больше на bash, так что могу ошибаться.

          Так что в реальности под виндой могут быть проблемы и с "||", "&&" и с exit.

          Ну и вообще менять текущую директорию нехорошо, так как после запуска батника из cmd в самой командной строке тоже текущая директория изменится.

          Вот, вспомнил.

          Внезапной подставой оказалось то, что по умолчанию exit завершает не батник, а текущий сеанс cmd.

          То есть если батник запущен из командной строки, то, вместо того, чтобы показать ошибку, окно cmd внезапно закрывается.

          Оказалось, нужно делать exit /B
          Ответить
          • О чем думали создатели MS-DOS, когда создавали такой неудобный язык для скриптинга?!. Вот в Линукс это продумано. :)
            Ответить
            • о бабках думали...
              Ответить
            • О скриптинге они думали в последнюю очередь. CMD - это командный процессор, а не скриптовый язык.
              Ответить
              • А вот в Линуксе подумали об этом и правильно сделали. Майкрософт в те годы был туповат...
                Ответить
                • В туповатом Майкрософте думали о том, как продать, а не о том, как сделать. Поэтому у линукса сейчас целый 1% рынка десктоп-систем.

                  В принципе, с пришествием PowerShell они искупили свою ошибку.
                  Ответить
                  • > с пришествием PowerShell они искупили
                    чота по-моему рановато
                    поскольку PS придумали при существующем WSH
                    так что возможно будет и еще админское средство, пропагандирующее другую технологию изобретенную MS
                    Ответить
                  • ага
                    искупили

                    вместо того, что бы наконец сделать как во всех остальных операционках стандартно, общепризнанно и удобно -- как всегда изобрели свой велосипед
                    Ответить
                    • "Как во всех остальных", это, простите, как в 1% линуксе и Мак Осе, построенном на ядре фрибзд и унаследовавшей от нее баш?

                      Нужен вам баш - ставьте баш, проблем то.
                      Ответить
                      • фейспалм))) столько фейлов на такой маленький пост)))

                        >> как в 1%
                        как в практически во всех остальных операционках от соляриса до опенбзд

                        >> и Мак Осе, построенном на ядре фрибзд
                        причем мак к фрибзд?
                        и ядро там ВООБЩЕ не бздшное
                        и уж тем более не фряшное

                        >>и унаследовавшей от нее баш?
                        баша нет во фре как-бы
                        там сиш по умолчанию и ш

                        Вы нихера не отличаете баш от ш
                        линукс от фрибзд
                        фрибзд от драгофлай бзд
                        итд

                        совет на будущее: не говорите про то, в чем не разбираетесь.
                        не будете выглядеть шлололошным ламером, как сейчас)))
                        Ответить
            • о простоте
              и продумано оно не в линукс, а в позикс/юникс
              в линукс взято именно оттуда, и в дос тоже
              но пиша дос, они думали о том, как сделать хоть что-то рабочее, да еще и на первом ibm pc) потому взяли из униксов только то, что осилили)
              Ответить
    • показать все, что скрытоУбого
      Ответить
    • показать все, что скрытоВеликолепно!
      Ответить
    • Ахаха... Долбоёб...
      Ответить

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