1. bash / Говнокод #19526

    −46

    1. 1
    2. 2
    3. 3
    find /etc/* -maxdepth 0 | while read -r path; do
        ...
    done

    Запостил: libreadline, 24 Февраля 2016

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

    • О, говнокод на bash привезли
      Ответить
    • А я догадываюсь, почему автор так сделал... При дефолтных настройках for name in "/etc/*" вернёт "/etc/*", если ничего не нашлось. Автор поди на этом обжёгся и теперь везде пишет через find.
      Ответить
      • Ну пиздец, теперь пусть кто-то мне скажет, что баш круче помершелла для скриптинга.

        Кстати, нахуя так было сделано? Что мешало вернуть пустой список, как и ожидалось?
        Ответить
        • > Кстати, нахуя так было сделано? Что мешало вернуть пустой список, как и ожидалось?
          Чтобы сообщения об ошибках были интуитивнее
          При cat *.txt в случае пустого раскрытия cat начнёт читать из терминала и юзер подумает, что cat завис, а при раскрытии со звёздочкой он сам напишет, что *.txt файлов нет.
          Ответить
          • Но для форича ожидаемый результат для пустого результата будет именно пустой список. Вот к чему приводит шелл вместо языка.
            Ответить
            • Хотите пустую строку — прикажите, чтоб выдавал пустую строку:
              shopt -s nullglob

              Однако в ряде случаев куда удобнее, чтоб выдавалась ошибка:
              shopt -s failglob
              Ответить
              • Хочу чтобы все работало просто и ожидаемо.
                Ответить
                • Нет, с libastral Баш пока не собирают, так что сам он ваши желания не угадает — надо явно указать ему на то поведение из двух предложенных, которое вы считаете ожидаемым.
                  Ответить
                  • Мои желания не совпадают с желаниями большинства в данном случае? Как получилось что ко всем языкам программирования этот либастрал подключен и форич там обрабатывается правильно?
                    Ответить
      • > Автор поди на этом обжёгся и теперь везде пишет через find.

        Но ведь в аргументах find тоже /etc/* со звездой, который раскрывается шеллом до вызова find. Ошибка же точно такая же будет.
        Ответить
        • показать все, что скрытоТы наверно хотел сказать со звездой без кавычек (одинарных или двойных)
          Ответить
          • показать все, что скрытоМинусующие - будьте добры пояснять что не нравится или идите нахуй.
            Ответить
            • Тебя, видимо, не поняли. И действительно -- к чему тут кавычки? Тут и 3_14dar'у будет понятно, что в кавычках не раскроется.
              Ответить
              • Кавычки наверно к тому чтобы звезду обрабатывал find, или под прыщами в такое не могут?
                Ответить
                • > под прыщами в такое не могут
                  Неа, там 99.9% софта даже не пытается паттерны раскрывать... Просто воспринимают как файл со звездой в имени.

                  Если хочешь чтобы find сам обрабатывал: find -name "*.mp4"
                  Ответить
                  • Да, я это и имел в виду, а нахера нужен find в посте?
                    Ответить
                    • Ну надо же было чем-то занять процессор!

                      BTW, find также проходится по ".скрытым" файлам, а glob такого не умеет (без соотв. setopt).
                      Ответить
                      • find действительно проходится по dotfiles, но не в этом же случае! Если не очевидно, то все, что происходит в этом «find /etc/* -maxdepth 0» — это раскрытие звездочки *шеллом* и проверка файлов на существование файндом.

                        > а glob такого не умеет (без соотв. setopt)

                        Во-первых, «shopt» (а точнее shopt -s dotglob), а не «setopt». А во-вторых, умеет разумеется:
                        for f in .* *; do
                            echo "$f"
                        done


                        (Да, тупая конкатенация, но прекрасно работает.)
                        Ответить
                        • Если файлы будут начинаться с "-" то будет пиздец?
                          Ответить
                          • Да. Где-то я тут эксплойт подобный писал для наивного вызова tar -zcf ../backup.tgz * (исполнение произвольного кода если в архивируемой папке есть специально названный файл)...
                            Ответить
                          • В данном примере будут неожиданности только тогда, когда будут файлы -n, -e, -ne, -en и какие там еще ключи у echo есть. Поэтому используем printf:
                            printf '%s\n' "$f"


                            У программ, следующим стандартам ГНУ, можно и нужно использовать маркер конца ключей «--»:
                            rm -- "$f"

                            а в случае, когда подстановка — имя файла, можно дописать точкой текущий каталог:
                            foodo "./$f"

                            А если и «--» не умеет, и речь не об имени файла — что ж, только санировать ввод.
                            Ответить
                            • > Поэтому
                              > У программ
                              > А если
                              Вот поэтому я и говорю, юзать баш для чего-то серьёзного - себе дороже. Не так он и прост, как кажется.
                              Ответить
                              • Строковой язык программирования до добра не доведет же.
                                Ответить
                                • TCL тоже строковый, но там это не так чувствуется.
                                  Ответить
                        • > Во-первых, «shopt» (а точнее shopt -s dotglob), а не «setopt».
                          О, вот щастливчик, который таки собрал libastral.so.1 :)

                          for f in * .*; do

                          Ну а против такой конструкции, конечно не попрёшь с монструозным find'ом, разве что для профилактики стоило бы еще shopt -s nullglob
                          Ответить
      • Ага, и что прикольно, в данном случае, while запустится в сабшелле. В большинстве случаев этот факт большой роли не играет, но как только надо выставить переменн{ую,ые} в цикле -- начинается фан.

        Да и кстати, с find | read нету проблемы с именами файлов, которые содержат пробел.
        Ответить
    • В этом треде прыщебляди соснули у повершеллобогов, у которых ls работает абсолютно ожидаемо.
      Ответить
      • И -- добавлять не надо, о чем на прыщах забывают 99,99%
        Ответить
        • Откуда слово "прыщи"? зоебал уже его использовать
          Ответить
      • Ха-ха, печет таки пидорам.
        Ответить

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