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

0

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

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

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

  • А я догадываюсь, почему автор так сделал... При дефолтных настройках 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"
                Ответить
                  • Ну надо же было чем-то занять процессор!

                    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"

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

                        for f in * .*; do

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

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

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

Где здесь C++, guest?!

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


    8