03 января 2017

Как создать собственный script (скрипт-сценарий) в Linux

Прежде всего давайте разберём, что такое script и для чего он нужен.

Script в переводе с английского - сценарий. Все мы смотрим фильмы, многие из нас - спектакли. Чтобы создать фильм/спектакль, сценаристы пишут к ним сценарии, на основании которых артисты, сценка за сценкой исполняют на сцене свои роли, из чего и складывается фильм/спектакль. Работа по созданию сценария довольно кропотливая, где нужно учесть всё до мелочей, чтобы в конечном итоге артисты могли выполнить задуманное сценаристом, а зритель увидел целостное произведение.

Подобным же образом пишутся скрипты для выполнения списка задач, которые пользователь составляет вместе (код), чтобы сделать их выполнение проще и быстрее в операционной системе. Для написания простых скриптов совсем не обязательно иметь образование программиста.

Для начала давайте создадим самый, что ни на есть, простейший скрипт-Shell для обновления системы.

Все действия я буду проводить с системе Ubuntu, но они применимы и к другим системам Linux, производных от Ubuntu. Для этого нам понадобятся: Текстовый редактор, чтобы наполнить его нужными задачами для создания скрипта (кода) и Терминал - для выполнения созданного скрипта. Эти инструменты установлены в любом дистрибутие Linux по умолчанию.

Итак, открываем текстовый редактор Gedit и вводим в него первые обязательные символы под названием shebang.
shebang в программировании, это последовательность из двух символов: решётки и восклицательного знака (#!) в начале файла скрипта. И добавляем к данным символам без пробелов /bin/sh - интерпретатор, где будет выполняться скрипт. /bin/sh - это обычно Bourne shell или совместимый интерпретатор командной строки, который передаёт "path/to/script" как первый параметр.
Первая обязательная строка скрипта будет выглядеть следующим образом:

#!/bin/sh

Далее, следующей строкой следует описание того, что должен выполнить наш первый скрипт/сценарий:

# Мой первый Script обновления Ubuntu

Знак решётки (#) в самом начале строки даёт понять интерпретатору/терминалу, что эту строку читать и выполнять не нужно. Строка нужна в коде данного скрипта для того чтобы сам создатель скрипта знал, что он собирается выполнить на данном отрезке/сценке в коде, чтобы не запутаться в дальнейшем, когда таких строк будет много. Такие строки с знаком решётки называются - закомментированные.

Далее в скрипте следуют выполняемые строки с командами, в данном случае для обновления системы Ubuntu:

sudo apt update
sudo apt upgrade -y


-y в конце второй команды даёт понять интерпретатору/терминалу, что это действие/команду нужно выполнить автоматически, без дополнительного подтверждения пользователем, нажатия  клавиши Ввод. y - сокращённо от английского yes, т.е. да.

Вот и всё. Ваш первый скрипт создан. У вас должно получиться как на снимке:


Остаётся сохранить созданный файл/скрипт и дать ему Имя с обязательным расширением в конце - .sh. Расширение .sh присваивается исполняемому файлу.
Я дал ему Имя - обновление.sh, сохранив в Домашней папке пользователя:


Для того чтобы созданный файл/скрипт был исполняемый, ему нужно дать на это разрешение. Сделать это можно двумя способами.

1. Выполнить следующую команду в терминале:

sudo chmod +x обновление.sh

2. Либо открыть  файловый менеджер в Домашней папке (где вы сохранили созданный скрипт), правый клик на файле, в контекстном меню - Свойства - Права и активировать пункт - Выполнение: Разрешить выполнение файла как программы:


Чтобы выполнить созданный скрипт, нужно открыть терминал ( о чём я писал в самом начале статьи, что терминал - необходимый атрибут/инструмент для выполнения скрипта), ввести sh, через пробел название скрипта - обновление.sh и нажать клавишу Ввод:


Либо в терминале вводим sh и перетаскиваем из файлового менеджера созданный файл с скриптом (также через пробел):


После того как путь к файлу отобразится после команды sh и пробела, достаточно нажать клавишу Enter (Ввод), чтобы выполнить обновление системы:


Теперь в любой момент вы можете сделать обновление системы созданным собственным скриптом.

Да, кто-то может возразить, что обновление системы не сложно сделать выполнением этих двух команд в терминале, зачем пыжиться и создавать какие-то скрипты? Всё верно. Но это пример создания простейшего скрипта, чтобы показать, что "не боги горшки обжигают" 😃.

Научившись писать и использовать простейшие скрипты, можно создать скрипт по настройке системы, с тем чтобы в случае переустановки системы могли воспользоваться созданным сценарием без необходимости искать каждый раз в сети сайты с подобными настройками.

Многие из вас, скорее всего, пользуются сайтами по настройке системы, типа тех что я публикую после выхода очередного релиза Ubuntu - Ubuntu после установки или подобными сайтами. Откройте один из таких сайтов: http://compizomania.blogspot.com/2016/04/ubuntu-1604.html, затем текстовый редактор для создания скрипта.
Для примера я сделал следующую заготовку.

В текстовом редакторе вводим первую обязательную строку:

#!/bin/bash

Далее закомментированные строки с описанием:

# Настройка Ubuntu после уставновки
# Обновление системы


Ниже следуют команды обновления системы:

sudo apt update
sudo apt upgrade -y


Строка описания: Добавление репозиториев:

# Добавление репозиториев

И добавляете необходимые репозитории для дальнейшей установки программного обеспечения:

sudo add-apt-repository "deb http://archive.canonical.com/ $(lsb_release -sc) partner" -y
sudo add-apt-repository ppa:atareao/telegram -y
sudo add-apt-repository ppa:atareao/atareao -y

sudo add-apt-repository ppa:nemh/systemback -y
sudo add-apt-repository ppa:gerardpuig/ppa -y
sudo add-apt-repository ppa:haecker-felix/gradio-daily -y

После того как необходимые репозитории добавлены (повторюсь, у вас могут быть свои репозитории, у меня пример), необходимо обновить систему:

Строка с описанием:

# Обновление системы после подключения репозиториев

И команда на выполнение:

sudo apt update

Теперь, когда репозитории добавлены и система обновлена, наступила очередь в установке программ:

# Установка программ

Для установки программ достаточно один раз ввести команду sudo apt install, а затем через пробел в данную строку добавлять сколько угодно программ, главное чтобы они были правильно составлены. Если какая-то программа состоит из нескольких слов, её команда должна быть монолитной, т.е. все слова в ней должны вводится через чёрточку, например: unity-tweak-tool:

sudo apt install my-weather-indicator telegram skype lm-sensors hddtemp psensor gdebi systemback unity-tweak-tool ubuntu-cleaner gradio -y

Установка дополнительных кодеков

# Мультимедиа и кодеки

sudo apt install ubuntu-restricted-extras -y

Отключение о сбоях в системе

# Отключить отчёты о сбоях в системе

sudo sed -i "s/enabled=1/enabled=0/g" '/etc/default/apport'

Ну вот, пожалуй, и всё. Данный созданный файл сценария должен выглядеть следующим образом:


Необходимо сохранить его (нажать кнопку Сохранить) и дать Имя с расширением .sh. Я назвал его Настройка\ Ubuntu.sh (вы можете назвать по-другому, но обязвтельно с расширением .sh):


Делаем созданный скрипт исполняемым:

sudo chmod +x Настройка\ Ubuntu.sh

Для выполнения созданного скрипта введите в терминале sh и название созданного скрипта через пробел, либо sh, пробел и перетащить в терминал созданный файл, как объяснялось ранее в простейшем скрипте и нажмите клавишу Ввод, для его выполнения.

Примечание. Обратный слэш в команде Настройка\ Ubuntu.sh экранирует пробел в названии файла для терминала между двумя отдельными словами.

После того как скрипт будет выполнен, хранить его на будущее, для возможной переустановки системы и повторной настройки, лучше всего на отдельном разделе ж/диска в папке /home. Если таковой нет, то в облачном сервисе (Облачное хранилище данных) типа:  DropBox, Облако Mail.Ru, Mega.co и т.п., чтобы в любой момент воспользоваться скриптом самому, либо помочь знакомым или родственникам в настройке системы.

Удачи.

43 комментария :

  1. Спасибо. Очень познавательно.

    ОтветитьУдалить
  2. Неплохо для начала, радует что комментировали действия.
    Но более корректно добавлять репозитарии скриптом, будет так.
    #Обновим репозитарии
    sudo apt-get -y update
    sudo apt-get -y --force upgrade
    #Обновим ключи репозитариев
    sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com `apt-get update 2>&1 | grep -o '[0-9A-Z]\{16\}$' | xargs`
    #Установка adb и всего прочего
    sudo apt-get -y --force-yes install android-tools-adb android-tools-fastboot # если $doing содержит 1, то установить adb.

    ОтветитьУдалить
  3. Большое спасибо ! Давно собирался занятся этим , все руки не доходили .

    ОтветитьУдалить
  4. Да подсказали бы, если укажите систему.) Но в большинстве дистрибутивов назначение горячих клавиш можно сделать в приложении Клавиатура - Комбинации клавиш. Вот хотя бы здесь посмотрите: http://compizomania.blogspot.com/2016/11/linix.html

    ОтветитьУдалить
  5. Спасибо огромное, действительно очень полезная информация.

    ОтветитьУдалить
  6. Спаибо, Владимир, за очень полезную статью с подробными комментариями для полного понимания, "век живи, век учись"!

    ОтветитьУдалить
  7. В MX16 sudo add-apt-repository не работает наверное что-то дополнительно надо установить?

    ОтветитьУдалить
    Ответы
    1. ==MX16 sudo add-apt-repository не работает== Конечно не работает, т.к. это Debian-дистрибутив и у него свои репозитории. Убунтовские не подойдут. Их не нужно указывать в скрипте.

      Удалить
  8. Владимир почему не запускается исполнение скрипта на уст-ку multisistem (изначально пытался как обычно через терминал, но вроде репоз-й не подкл-ся) На одном из сайтов скачал скрипт- и опять никак. Выставил и права на исполн. и в наутилусе тоже выставил галочки как положено. Но при запуске скрипта требуется права sudo. Пишу sudo - всё тоже самое. Помогите пожалуйста.

    ОтветитьУдалить
  9. Ответы
    1. Скиньте в комментарий сам скрипт, чтобы посмотреть что он собой представляет. Иначе трудно ответить.

      Удалить
    2. Владимир, спасибо за ответ. На компе, с которого пишу всё классно установилось. На другом компе(моноблоке) этот же скрипт никак!!! Кстати, на Вашем сайте уст-ка multisistem через терминал работает или нет? Спасибо.

      Удалить
  10. как корректно сделать выполнение скрипта по событию выключения или перезагрузки. К примеру нужно удалить файл и вместо него записать другой, но ничего не выходит, иногда правда удаление происходит.

    ОтветитьУдалить
    Ответы
    1. saansan, несколько раз прочитал Вас коммент, но к сожалению так ничего не понял. То Вы пишите о выключении и перезагрузке, а в пример приводите удаление одного файла и запись другого. Как-то всё сумбурно.

      Удалить
    2. Есть очередь скриптов выполняемая во время старта и выключения, кажись в rc.d подобных ссылки лежат. Выполнение в очереди как я понял происходит согласно значимости в системе, так что бы не вырубить раньше времени процессы без сохранения данных. Так вот почему то простенький скрипт отказывается выполняться, хоть и рут права ему даются. Тот же самый скрипт нормально выполняется при включении в автозагрузку с пользовательскими правами. Мне хотелось сделать выполнение на перезагрузку и отключение.

      Удалить
  11. Огромное спасибо,полезная информация.

    ОтветитьУдалить
  12. Владимир, есть проблема. Появилась недели две назад.
    Ubuntu 12/04 при обновлении в менеджере выдает такое сообщение:
    W:Failed to fetch http://ppa.launchpad.net/gerardpuig/ppa/ubuntu/dists/precise/main/source/Sources 404 Not Found
    , W:Failed to fetch http://ppa.launchpad.net/gerardpuig/ppa/ubuntu/dists/precise/main/binary-amd64/Packages 404 Not Found
    , W:Failed to fetch http://ppa.launchpad.net/gerardpuig/ppa/ubuntu/dists/precise/main/binary-i386/Packages 404 Not Found
    , E:Some index files failed to download. They have been ignored, or old ones used instead.
    Потом пишет, что нет интернет соединения. Хотя оно работает
    А в панели висит красный треугольник, говорит, что информация об обновлениях устарела.
    Бьюсь уже неделю, но установить обновления не могу.
    Как выйти в этой ситуации.
    Заранее спасибо.

    ОтветитьУдалить
    Ответы
    1. Судя по извещению, репозиторий глючит для Ubuntu Cleaner, т.к. он не для Ubuntu 12.04.
      Откройте Источники приложений, удалите репозиторий ppa:gerardpuig/ppa
      И сделайте обновление системы.

      Удалить
    2. Или выполните следующие команды в терминале:
      sudo add-apt-repository -r ppa:gerardpuig/ppa
      sudo apt-get update

      Удалить
    3. Владимир, огромное спасибо, уже сделал - да, помогло.

      Удалить
  13. Какую команду прописать в скрипте, чтобы его выполнение писалось в текстовый файл, а не только на экран терминала и закрывался. Для того чтобы можно было потом посмотреть ошибки выполнения. Типа лог скрипта.
    Спасибо.

    ОтветитьУдалить
  14. Поддерживаю, было бы полезно!

    ОтветитьУдалить
  15. У меня Убунта 12.04. Вот мой скрипт#!/bin/sh
    sudo apt-get update -y
    sudo apt-get upgrade -y
    Делаю,все как Вы написали. Проблема: все равно запрашивается пароль. Как решить данную проблему?

    ОтветитьУдалить
    Ответы
    1. == все равно запрашивается пароль. Как решить данную проблему?== Конечно после команды c sudo будет первый раз запрашиваться пароль. Если не хотите постоянно вводить пароль, как администратор системы, откажитесь от него: http://compizomania.blogspot.com/2014/02/sudo-ubuntu.html

      Удалить
  16. sh зачем обязательно?У меня скрипты и без этого расширения работают.

    ОтветитьУдалить
    Ответы
    1. ==sh зачем обязательно?У меня скрипты и без этого расширения работают.== Скрипт без расширения будет работать, если Вы перетаскиваете его в терминал или указываете полный путь к нему. Расширение .sh даёт возможность по клику на файле с скриптом выполнять его без необходимости открывать терминал.
      Вот как-то так можно ответить на Ваш вопрос.

      Удалить
    2. Без терминала не виден процесс,вдруг ошибка

      Удалить
    3. Не обязательно перед скриптом указывать sh.
      Достаточно так:
      $ chmod -x myscript.sh
      $ ./myscript.sh

      Удалить
  17. Здравствуйеу!! Всех с праздниками! Подскажите как прикрутить в скрипт звуковой фаил. Суть такова , сделан скрипт простого термостата по температуре включает и выключает нагреватель. Хотелось бы чтоб во время включения проигровался звук. Скрипт делал в прошлом году, где про это читал не могу найти , может удалили. Или носом ткните где почитать.

    ОтветитьУдалить
    Ответы
    1. Вячеслав, не это Вы ищете случайно? http://compizomania.blogspot.com/2014/02/ubuntu-120413101404.html

      Удалить
    2. Спасибо Владимир, пинок в нужную сторону. Сделал так пока.
      #!/bin/bash

      mplayer /home/slava/zvuki/01075.mp3

      Удалить
    3. Лучше взгляните в сторону python. Он не намного сложнее bash, но овладев пайтоном вы получаете действительно полноценный инструмент.

      Удалить
  18. Разрешите позанудствовать:
    1. Если уж запускаем через "sh обновление.sh", тогда уж нужно и в заголовке писать /bin/sh, а не /bin/bash. А то получается скрипт писали для одного интерпретатора, а зупускаем в другом. В данном конкретном случае, все равно, но для более сложных скриптов могут быть нюансы.
    2. Раз уж сделали файл исполняемым, так запускаем ./обновление.sh, а не "sh обновление.sh". В этом случае как раз будет корректно выбран интерпретатор из директивы #!

    ОтветитьУдалить
  19. Если напихать в систему слишком много всего, то иногда без прямого вызова bash, типа sudo bash ***********.sh, сложный скрипт не хочет запускатся.

    В таких случаях я сразу вспоминаю забавную сценку из сериала Мистер Робот. Где у какой-то сексуальной дурочки, причём сидящей на унитазе, никак не получается взломать ФБР.

    ОтветитьУдалить
  20. Подскажите плиз, куда посмотреть. Нужно склеить скрипт для запуска обновлений на компьютерах в локальной сети. В сети машины на Ubuntu-Mate 16.04, a мой с Ubuntu 16.04. Буду очень признателен

    ОтветитьУдалить
    Ответы
    1. можно сделать следующим образом:
      #!/bin/sh
      ssh 192.168.1.1 'apt-get update && apt-get upgrade'

      Удалить
    2. Или даже так:
      #!/bin/sh
      HOSTS="192.168.1.1 192.168.1.2 192.168.1.3"
      LOG="/var/log/update.log"
      for i in $HOSTS
      do
      ssh $i 'apt-get update && apt-get upgrade'
      if [ ! $? = 0 ]; then
      echo "Что-то пошло не так c $i..." >> $LOG
      else
      echo "Команда обновления успешно отправлена на $i!"
      fi
      done

      Можно через пробел записать IP-адреса хостов в переменную HOSTS, цикл for будет выполняться до тех пор, пока не обработает все хосты. Условие if [ ! $? = 0 ] проверяет успешно ли выполнена команда по коду возврата, если код возврата не равен нулю,то будет соответствующая запись в логе и наоборот.

      Удалить
  21. В дополнение ко всему вышесказанному можно добавить следующее. При написании скриптов бывает полезно запускать скрипт в режиме отладки. Я режим отладки включаю так:
    #!/bin/sh -x

    ОтветитьУдалить
  22. владмир нужна помощь в создание скрипта буду очень рад если ответите
    работа очень интерессная

    ОтветитьУдалить

Если у Вас появились вопросы или мнения, вы можете задать или оставить их здесь.
Спам и флуд будут жёстко караться вечной блокировкой их оставляющих!



If You have any questions or opinions about, just leave'em here.
Spamers & flooders will be blocked forever!!!