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

    −139.2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 24 Марта 2010

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

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

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

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

      Да даже и на баше ... можно было бы `ls -1 $musicdir` в массив засунуть и не мучать систему постоянным сканированием директории :D
      Ответить
      • У меня на системе стоит проигрыватель 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 тоже сильно.
      Короче, зачот!
      Ответить

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