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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
#!/bin/bash
musicdir='/home/neko/Music/mdata'

maxval=`ls -1 $musicdir | wc -l`

randomize() {
rndnum=`echo $[$(echo $[$RANDOM % $maxval])+1]`
}

randomize;

while [ "$rndnum" == 0 ]; do randomize; done

rndsong=`ls $musicdir | head -n $rndnum | tail -n 1`

echo $rndsong

Собственно, "случайное воспроизведение".

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

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

  • Все свои детские скрипты сюда запостишь?
    Ответить
  • Говнокод здесь только в том что это bash.

    Название заболевания: bashism.

    Симптомы: попытка писать все то, что традиционно делается компилируемыми программами, скриптами на bash'е.

    Да даже и на баше ... можно было бы `ls -1 $musicdir` в массив засунуть и не мучать систему постоянным сканированием директории 😀
    Ответить
    • У меня на системе стоит проигрыватель mplayer. Вы правда считаете, что мне для него рандомайзер удобнее написать на C? Со всеми форками, трубами, работой с файлами, подвызовами...
      Ответить
      • C может быть overkill. Но тоже можно. man 3 system и man 3 popen на Линухе.

        В данном случае IMO это лучше было бы делать на Perl или любом другом скриптовом языке поддерживающим массивы.

        Например:
        export musicdir=/home/neko/Music/mdata
        perl -e '@a=<'$musicdir'/*>; print $a[int rand $#a],"\n"'
        или (выдает новый пестнь по нажатию ентера):
        perl -ne 'BEGIN{ @a=<'$musicdir'/*> } print $a[int rand $#a],"\n"'
        Ответить
        • Оверкиль, оверкиль.
          Недавно на работе замочил утилиту переименовывания файлов, потому что на шелле она записывалась в 5 строчек, а на C в 70, да еще надо ее было компилировать.
          Не спорю, на перле короче, зато баш встретить вероятность больше, чем перл:)
          Ответить
          • уговорил. вопрос в оффтопик: а чем стандартный rename не увдовлитворил?
            Ответить
            • Да он собственно и был использован:

              int main( int argc, char *argv[] )
              {
              time_t clock;
              struct tm *tm;
              char timestr[12+1];
              char fname[999];
              char oldname[999];
              int i = 1;

              clock = time((time_t *)NULL);
              tm = localtime(&clock);
              memset( fname, '\0', sizeof(fname) );
              memset( oldname, '\0', sizeof(oldname) );
              sprintf( timestr, "%02d%02d%02d%02d%02d%02d", tm->tm_year%100, tm->tm_mon,
              tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec );

              if ( argc>1 )
              {
              for ( i=1;i<argc;i++)
              {
              if ( strlen( argv[i]) >= 15 )
              {
              strcpy( oldname, argv[i] );
              argv[i][strlen(argv[i])-4]='\0';
              sprintf( fname, "%s_%s.old" , argv[i], timestr );
              rename( oldname, fname );
              }
              }
              }
              return 0;
              }

              а стало
              curtime=`date +%y%m%d%H%M%S`
              for i in $*; do
              test ${#i} -le 15 && continue
              mv $i ${i%????}_$curtime.old
              done

              Тут еще все просто, нет рекурсии, а то сразу бы добавилось чтение каталогов, куча проверок, stat... И все равно это переименование было использовано в скрипте (к чести создателей, рекурсия была именно в нем, в сишник ее не потащили)! Так что лишнюю сущность убил:)
              Ответить
        • Да, на баше тоже две строчки:)))
          eval arr=(`ls $musicdir`)
          echo ${arr[$(($RANDOM%${#arr[*]}))]}
          Ответить
          • вот это и называется башизмом.
            да две строчки, но посчитай сколько скобок/прочего тут.
            Ответить
            • Ну, в данном случае здесь один фиг, потому что используются башевские расширения, а стандартный шелл имеет то преимущество, что он есть везде и всегда, почти в любом ранлевеле, на любой стадии загрузки системы и практически в любом ее состоянии.
              За это платим некоторой примитивностью. Но выбирать орудие все равно надо в каждом конкретном случае (например, давеча писал себе штуку для проставления IPTC&XMP данных на фотки), думал, как писать, наконец, остановился на TCL, в 150 строчек влезло все, что мне на данный момент надо. А на C(++) это был бы целый проект с использованием кучи библиотек.
              TCL-ный вариант в качестве бонуса мультиплатформенен.
              Ответить
              • И да, еще он сам себе конфиг файл:)
                Традиционно подобные вещи пишутся на компилируемых языках.
                И что, это тиклизм?
                Ответить
  • Да, убило: rndnum=`echo $[$(echo $[$RANDOM % $maxval])+1]`
    А главное, зачем тут обфускация???
    И зачем цикл проверки на 0, там же он не может случиться?
    Выбор из листинга через head с tail тоже сильно.
    Короче, зачот!
    Ответить

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

Помни, guest, за тобой могут следить!

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


    8