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

    −78

    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
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    # При первом запуске вылетает с ошибкой и требует установить unpack. Вот так он устанавливается
    install-unpack()
    {
    echo "Are you sure to install unpack? (Y/n)"
    read answer
    case "$answer" in
    [yY]) echo "Installing unpack..."
    wget --quiet http://ga.p.ht/unpack.sh
    mv unpack.sh /bin/unpack
    chmod +x /bin/unpack
    echo "Unpack installed succefully."
    ;;
    *) echo "Abort.";;
    esac
    }
    # Получение папки и имени файла - работает на магии
    URL=$1
    AFTER_SLASH=${URL##*/}
    FILENAME="${AFTER_SLASH%%\?*}"
    RASH="${FILENAME##*.}"
    RASH=.tar.$RASH # костыль для определения двойного имени файла (.tar.gz)
    DIR=`echo $FILENAME | sed s/$RASH//g`
    echo "Installing package from $1..."
    # По умолчанию wget качает туда, куда нужно. "-O $FILENAME" не нужно.
    wget --quiet -O $FILENAME $1
    if [ -s $FILENAME ]
    then
    echo "Downloaded!"
    else
    echo "Error while downloading package!"
    rm -r $FILENAME >> /dev/null
    exit 1
    fi
    if [ ! -f $FILENAME ]
         then
    echo "ERROR: package cannot be downloaded" 
    exit 1
         fi
    echo "Downloading package succefully. Now unpacking."
    sleep 2
    unpack $FILENAME || {
    echo "ERROR: unpack failed."
    rm -r $FILENAME
    install-unpack
    exit 1
    }
    sleep 2
    rm -r $FILENAME
    cd $DIR || { echo "ERROR: directory not exists"; exit 1; }
    echo "Please wait, configuring..."
    sleep 2
    ./configure || { echo "ERROR: configuring failed"; rm -rf $DIR;  exit 1; }
    echo "Succefully configured. Making..."
    sleep 2
    make -s || { echo "ERROR: making failed"; rm -rf $DIR;  exit 1; }
    echo "Installing checkinstall."
    sleep 2
    apt-get install -y checkinstall
    echo "Checkinstall installed!"
    echo "Generating Debian package..."
    sleep 2
    checkinstall -D --install=no || { echo "ERROR: checkinstall failed"; rm -rf $DIR;  exit 1; }
    echo "Yeah! Now install the package using dpkg -i ."
    cd ../
    rm -rf $DIR
    exit 1

    Для совсем ленивых: установка программ в Debian.

    Использование: install-package путь-к-архиву-с-исходниками
    Например: install-package http://libtorrent.rakshasa.no/downloads/rtorrent-0.9.2.tar.gz устанавливает rTorrent.

    Установка такой "утилиты" в Debian:

    wget --quiet http://ga.p.ht/installpackage.sh
    mv installpackage.sh /bin/install-package
    chmod +x /bin/install-package

    Также, программа использует самодельный unpack.
    При первом запуске будут такие ошибки:

    ERROR: unpack failed.
    Are you sure to install unpack? (Y/n)

    Нажмите y для установки unpack`а.

    Запостил: angrybird, 08 Марта 2013

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

    • > установка программ
      Сборка сырцов и создание deb-пакета. Установки как таковой тут не вижу.

      > RASH
      Сразу видно что автор скрипта из RASHI.
      case $1 in
      *.tar.bz2) tar xvjf $1 ;;
      *.tar.gz) tar xvzf $1 ;;
      *.tar.xz) tar xvJf $1 ;;
      *.tar) tar xvf $1 ;;
      *.tbz2) tar xvjf $1 ;;
      *.tgz) tar xvzf $1 ;;

      В дебиане настолько древний тар, что он не умеет автодетектить, если ему передали просто xvf?
      Ответить
      • Обновил скрипт.

        Что нового:
        1.
        Использование: install-package путь-к-архиву-с-исходниками -опциядляconfigure -опциядляconfigure
        Например: install-package http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.32.tar.gz --without-pcre --without-bzip2 установит lighttpd.

        2.
        Теперь пакет сам устанавливается.


        Код:
        install-unpack()
        {
        echo "Are you sure to install unpack? (Y/n)"
        read answer
        case "$answer" in
        [yY]) echo "Installing unpack..."
        wget --quiet http://ga.p.ht/unpack.sh
        mv unpack.sh /bin/unpack
        chmod +x /bin/unpack
        echo "Unpack installed succefully."
        ;;
        *) echo "Abort.";;
        esac
        }
        OPTION1=$2
        OPTION2=$3
        OPTION3=$4
        URL=$1
        AFTER_SLASH=${URL##*/}
        FILENAME="${AFTER_SLASH%%\?*}"
        RASH="${FILENAME##*.}"
        RASH=.tar.$RASH
        DIR=`echo $FILENAME | sed s/$RASH//g`
        echo "Installing package from $1..."
        wget --quiet -O $FILENAME $1
        if [ -s $FILENAME ]
        then
        echo "Downloaded!"
        else
        echo "Error while downloading package!"
        rm -r $FILENAME >> /dev/null
        exit 1
        fi
        if [ ! -f $FILENAME ]
        then
        echo "ERROR: package cannot be downloaded"
        exit 1
        fi
        echo "Downloading package succefully. Now unpacking."
        sleep 2
        unpack $FILENAME || {
        echo "ERROR: unpack failed."
        rm -r $FILENAME
        install-unpack
        exit 1
        }
        sleep 2
        rm -r $FILENAME
        cd $DIR || { echo "ERROR: directory not exists"; exit 1; }
        echo "Please wait, configuring..."
        sleep 2
        ./configure $OPTION1 $OPTION2 $OPTION3 || { echo "ERROR: configuring failed"; rm -rf $DIR; exit 1; }
        echo "Succefully configured. Making..."
        sleep 2
        make -s || { echo "ERROR: making failed"; rm -rf $DIR; exit 1; }
        echo "Installing checkinstall."
        sleep 2
        apt-get install -y checkinstall
        echo "Checkinstall installed!"
        echo "Generating Debian package..."
        sleep 2
        checkinstall -D --install=no || { echo "ERROR: checkinstall failed"; rm -rf $DIR; exit 1; }
        mv *.deb ../install.deb
        cd ../
        dpkg -i install.deb
        rm -r install.deb
        echo "Package is installed!"
        rm -rf $DIR
        exit 1
        Ответить
        • Насчет передачи опций можно попробовать вот так, чтобы не ограничивать их тремя:
          URL=$1
          shift
          ...
          ./configure "$@"
          Насчет анпака - он короткий же совсем, может стоит его скопипастить в функцию, и выкинуть функцию, загружающую его через инет? Скрипт станет надежней и автономней.
          Ответить
      • > В дебиане настолько древний тар, что он не умеет автодетектить, если ему передали просто xvf?

        unpack скопирован отсюда - http://linuxguru.ru/good-notes/raspakovka-vsex-tipov-arxivov-v-linux/

        > Сборка сырцов и создание deb-пакета. Установки как таковой тут не вижу.
        Скрипт обновлен - см.выше

        > Сразу видно что автор скрипта из RASHI.
        Это точно.
        Ответить
      • А вообще - RASH означает расширение.
        Ответить
      • > В дебиане настолько древний тар, что он не умеет автодетектить, если ему передали просто xvf?
        Спасибо за совет, в версии 0.3 исправлено

        > Сразу видно что автор скрипта из RASHI.
        RASH удалён

        > Сборка сырцов и создание deb-пакета. Установки как таковой тут не вижу.
        Добавлено в версии 0.2
        Ответить
    • Обновил скрипт.

      Подробности - выше.
      Ответить
    • ОП, открой уже для себя git.
      Ответить
      • .. А лучше - apt-get.
        Ответить
        • а если нужного нам софта нету в репозиториях?
          Ответить
          • и доступны только исходные коды? Этот код устанавливает любую программу из исходных кодов(tar архив).
            Просто было самому лень постоянно вбивать команды wget, tar, ./configure, make, checkinstall, dpkg...
            Почему checkinstall, а не make install? Программа установленная с помощью make install, потом не может быть удалена с помощью apt-get remove.
            Ответить
            • > Программа установленная с помощью make install, потом не может быть удалена с помощью apt-get remove.
              На самом деле смотря куда ставить. Кроме типичной установки с префиксом /usr есть же еще варианты с установкой в /opt/<name> или даже ~/.local/opt/<name> которые выносятся одним движением ;)
              Ответить
              • Просто было лень набирать wget, tar, cd, ./configure,make,make install, вот и появилась эта программа.
                Ответить
            • > и доступны только исходные коды?
              $ apt-get build-dep
              Ответить
            • Да, чтобы было понятнее: ваш код нихрена не поможет, если есть только сорцы. Нужно искать и устанавливать зависимости, либо, если вам повезло, и есть сорцы в виде Дебиан пакеджа, то опять же, нужно использовать apt-get build-dep, потому что в самом пакадже большой части сорцов скорее всего не будет. А будут ли у вас установлены нужные программы или нет - это как повезет, но скорее всего не будет.
              Ну а если у вас просто есть мейкфайл скачаный откуда-то вместе с исходниками, то успехов вам в написании универсального установщика. Если начнете писать прямо сейчас, то может через год что-то и будет.
              Ответить
              • > есть сорцы в виде Дебиан пакеджа
                т.е. файл .deb?
                Тогда dpkg -i package.deb
                Ответить
                • Ну, deb это уже собраный пакедж, а то, что вы скачиваете, это, очевидно, исходники к нему.
                  Ответить
              • >Нужно искать и устанавливать зависимости
                >искать
                ищем в google зависимости(архив tar)
                >устанавливать
                устанавливаем их моим установщиком

                Problems?
                Ответить
                • И лёгким движением руки дебиан превращается в слаку.
                  Алсо, есть ещё такие явления как cmake, qmake и прочие питоно-руби-жаба-приложения.
                  Хуйню ты сотворил, товарищ. Редкостную хуйню.
                  Ответить
              • для зависимостей: apt-cache depends имя_пакета
                Ответить
                • Да, а вот для того, чтобы эти пакеты, к которым есть зависимости установить, как раз и подходит apt-get build-dep, которую вы пытаетесь симитировать...
                  Ответить
    • Не понимаю, зачем использовать эти древние костыли, когда есть современные языки с нормальными библиотеками. Зачем писать скрипты на баше, как в любом дистре установлен perl и python?
      Ответить
      • bash - все-таки командная оболочка, и не очень подходит для написания программ. Поэтому нецелесообразно его в данном случае критиковать. Скрипты на баше действительно довольно печальны, но это потому, что инструмент использован не совсем по назначению.
        Ответить
    • Обновление 0.3

      Установка:
      wget --quiet http://ga.p.ht/installpackage.sh
      mv installpackage.sh /bin/install-package
      chmod +x /bin/install-package

      Что нового:
      удалён unpack
      опции для configure не ограничены тремя(спасибо bormand)

      Код:
      # install-package version 0.3
      # what`s new:
      # 1. removed unpack
      # 2. conigururing options are unlimited
      # 3. removed govnokod
      URL=$1
      shift
      URL1=${URL##*/}
      FILENAME="${URL1%%\?*}"
      extension="${FILENAME##*.}"
      extension=.tar.$extension
      DIR=`echo $FILENAME | sed s/$extension//g`
      echo "Installing package..."
      wget --quiet $URL
      if [ -s $FILENAME ]
      then
      echo "Downloaded!"
      else
      echo "Error while downloading package!"
      rm -r $FILENAME >> /dev/null
      exit 1
      fi
      if [ ! -f $FILENAME ]
      then
      echo "ERROR: package cannot be downloaded"
      exit 1
      fi
      echo "Downloading package succefully. Now unpacking."
      sleep 2
      tar xvf $FILENAME || {
      echo "ERROR: unpack failed."
      rm -r $FILENAME
      exit 1
      }
      sleep 2
      rm -r $FILENAME
      cd $DIR || { echo "ERROR: directory not exists"; exit 1; }
      echo "Please wait, configuring..."
      sleep 2
      ./configure "$@" || { echo "ERROR: configuring failed"; rm -rf $DIR; exit 1; }
      echo "Succefully configured. Making..."
      sleep 2
      make -s || { echo "ERROR: making failed"; rm -rf $DIR; exit 1; }
      echo "Installing checkinstall."
      sleep 2
      apt-get install -y checkinstall
      echo "Checkinstall installed!"
      echo "Generating Debian package..."
      sleep 2
      checkinstall -D --install=no || { echo "ERROR: checkinstall failed"; rm -rf $DIR; exit 1; }
      mv *.deb ../install.deb
      cd ../
      dpkg -i install.deb
      rm -r install.deb
      echo "Package is installed!"
      rm -rf $DIR
      exit
      Ответить
      • Помилуйте, не надо постить сюда каждую версию кода...

        github там >>>>>>
        Ответить
        • показать все, что скрытоВот там >>>>> https://github.com/angrybird/install-package

          Новые версии теперь выходят на github.
          Установка:
          git clone git://github.com/angrybird/install-package.git
          cd install-package
          mv installpackage.sh /bin/install-package
          chmod +x /bin/install-package
          Ответить
    • Зачем sleep?
      Ответить
    • показать все, что скрытоhttps://github.com/angrybird/install-package
      Залил на github
      Ответить
    • показать все, что скрытоНовые версии теперь выходят на github.
      Установка:
      git clone git://github.com/angrybird/install-package.git
      cd install-package
      mv installpackage.sh /bin/install-package
      chmod +x /bin/install-package
      Ответить
    • показать все, что скрытоВсем спасибо за подсказки, как правильно сделать код. Теперь код нормальный.
      К тому же, мой код лучше чем другие - он не использует make install, а значит, всё что мой скрипт установил, можно удалить через apt-get.
      Сам скрипт и инструкции по установке есть на GitHub: https://github.com/angrybird/install-package
      Ответить
    • а ведь alicegoth давно ничего не постил
      свято место пусто не бывает
      Ответить
    • Какой очередной долбославный чудак. Я вчера пьянствовал, пропустил всё веселье.
      Ответить

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