Bash существует уже давно и используется многими айтишниками, работающими с ОС Linux и не только, на ежедневной основе. Кстати, в августе 2016 года компания Microsoft выпустила версию bash для Windows 10 Anniversary. Так что bash теперь доступен не только пользователям *nix-систем. Давайте познакомимся с этим сценарием командной оболочкой поближе.
Командная оболочка. Определение.
С самого начала существования компьютеров, системные администраторы и программисты использовали для рутинной работы, на которую уходило масса времени, сценарии командной оболочки. Так что же это такое? И почему оно так важно?
Сценарий — это текстовый файл с набором команд, следующих в порядке их исполнения, на языке конкретной оболочки. (в нашем случае, рассматривается bash)
Командная оболочка — это интерфейс командной строки в операционной системе. (shell)
По сути сценарий — это крохотная программа, написанная с помощью команд операционной системы. Сценарии в основном используются для автоматизации специальных задач. Обычно таких, которые выполнять вручную не приносят никакого удовольствия. Например, изменение имени файлов, добавление пользователей или групп пользователей, настройка системы и т.д. Сценарии могут включать несложную логику, благодаря этому можно даже реализовать простенькие игры.
В системах OS X, BSD и Linux существует большое количество различных командных оболочек, таких как tcsh, zsch, pdksh и т.д. Каждая из них обладает своими особенностями и возможностями. И несмотря на то, что в *nix системах имеется большое разнообразие консольных оболочек, которые можно настроить на использование любого языка сценариев, по умолчанию оболочки будут настроены, скорее всего, на использование bash. Будь то gnome-terminal в Gnome, konsole в KDE или еще что-нибудь.
На первый взгляд, использование терминала может показаться сложным. Но поверьте моему многолетнему опыту, стоит только начать вникать в таинство команд bash, как для вас станет естественным просто открыть терминал, чтобы быстро что-то изменить, чем тыкать мышкой по меню, в поисках нужного параметра, чтобы изменить его.
Запуск команд.
У bash есть одна особенность, это запускать команды в системе, миную создания текстового файла. Давайте опробуем эту возможность в деле. Откройте терминал, который используется в вашей *nix системе(обычно его можно запустить клавишами Ctrl+ALt+T). И введите в него следующую строку:
user@computer$ echo «Hello World»
После нажатия клавиши Enter, на экране вы должны увидеть фразу «Hello World». Эта строка кода, введенная в терминал, запускает команду echo, которая хранится в стандартной библиотеке bash и предназначена для передачи информации в стандартный поток вывода. Список каталогов, в котором хранятся стандартные команды, хранится в переменной PATH. Для просмотра этой переменной, так же можно воспользоваться командой echo так, как в примере ниже:
user@computer$ echo $PATH
/home/local/user/.local/bin:/home/local/user/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
В выводе мы можем увидеть все каталоги, в которых bash будет искать, запускаемую нами команду или программу. Если команда будет находится в каталоге, отсутствующем в списке, то bash не сможет ее запустить. Так же хочу обратить внимание, что bash проверяет каталоги именно в том порядке, в котором они перечислены в PATH. И если у вас существует две одинаковые команды, но расположенные в разных каталогах, то запустится именно та, которая расположена в каталоге, находящемся в списке переменной PATH первым. Кстати, в таком случае, советую воспользоваться командой which, чтобы увидеть в каком каталоге bash найдет команду.
user@computer$ which python3
/usr/local/bin/python3
$ which echo
/usr/bin/echo
Вообще, команда which очень полезна. С помощью нее можно определить точный путь откуда будет запущена команда или приложение.
Настройка оболочки входа.
При открытии нового сеанса командной оболочки, первым делом считываются сценарии входа в домашнем каталоге и выполняются команды, перечисленные в нем. Сценарии входа, в зависимости от оболочки расположены в файлах .login, .profile, .bashrc или .bash_profile. Вы можете добавить в сценарий входа настройку переменной PATH, включив в нее другие каталоги или изменив их порядок, а так же подкорректировать любые другие настройки, такие как внешний вид строки и любые другие параметры.
На своей рабочей машине я откорректировал файл .bashrc, добавив дополнительный путь к каталогу с моими сценариями. Посмотреть это файл, можно с командой cat. Команда cat принимает аргумент с именем файла и выводит его содержимое в окно консоли. У меня все это выглядит так:
user@computer$ cat ~/.bashrc
export PATH=»$PATH:$HOME/bash/bin» #Добавление каталога с моими сценариями bash
Команда вывела содержимое файла .bashrc. В нем переменной присваивается новое значение, позволяющая запускать мои личные сценарии из указанного каталога как обычную команду. Обратите внимание, в этом выводе присутствует, кроме переменной PATH, еще переменная HOME. Эта переменная предназначена для хранения полного пути к домашнему каталогу. Давайте посмотрим, что в ней хранится.
user@computer$ echo $HOME
/home/local/user
Вместо $HOME в .bashrc можно было написать /home/local/user. Смысл от этого не поменялся бы.
Запуск сценариев.
Итак, мы познакомились с тремя командами: echo, which и cat. Но пока использовали их по отдельности, а не вместе, то есть не в составе сценариев. Давайте это исправим. Откройте любой удобный для вас текстовый редактор и введите в него следующий текст и сохраните его под именем first_scenario:
echo "Hello World"
echo $(which neqn)
cat $(which neqn)
В этом примере наглядно демонстрируется использование сценария для выполнения группы команд по порядку. Первая строка в сценарии выводит на экран фразу «Hello World». Вторая строка выглядит чуть посложнее, она использует команду which для поиска файла сценарий neqn, после этого результат команды передается в echo, которая выводит результат на экран. То же самое мы проделали в третьей строке, только результат выполнения команды which мы передали в команду cat, которая выведет содержание сценария neqn. Если рассматривать с технической точки зрения, то процесс выполнения второй и третьей строчки следующий. bash использует подоболочку, в которой запускает команду which. После этого сохраняет результат выполнения работы и подставляет его в качестве аргумента к команде echo.
После того как вы написали свой сценарий и сохранили его, необходимо его запустить следующей командой:
user@computer$ sh first_scenario
Hello World
/usr/bin/neqn
#! /bin/sh
# Copyright (C) 2014 Free Software Foundation, Inc.
#
# This file is part of groff.
#
# groff is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 2 of the License (GPL2).
#
# groff is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# The GPL2 license text is available in the internet at
# http://www.gnu.org/licenses/gpl-2.0.txt.
# Provision of this shell script should not be taken to imply that use of
# GNU eqn with groff -Tascii|-Tlatin1|-Tutf8|-Tcp1047 is supported.
GROFF_RUNTIME=»${GROFF_BIN_PATH=/usr/bin}:»
PATH=»$GROFF_RUNTIME$PATH»
export PATH
exec eqn -Tascii ${1+»$@»}
# eof
Запуск сценария производится с помощью команды sh, которой передается имя сценария в качестве аргумента. Эта команда проходит по всем строкам сценария и выполняет команды друг за другом. Как можно увидеть в выводе, сначала на экран выводится сообщение «Hello World», затем путь к сценарию neqn, ну и в конце содержимое сценария neqn.
Упрощаем запуск сценария.
Чтобы не использовать команду sh каждый раз для запуска ваших сценариев, можно немного доработать наш файл. Во первых, добавим в начало нашего сценария строку «#! /bin/bash». В итоге должно получится следующее:
#!/bin/bash
echo "Hello World"
echo $(which neqn)
cat $(which neqn)
Строка, которую мы добавили, обыxно называют ше-банг (shebang). При помощи этой строки командная оболочка определяет, какую программу запустить для интерпретации сценария. В данном случае мы указали bash. Существуют и другие строки, которые можно встретить. Например, для Perl — !#/usr/bin/perl или для Python — !#/usr/bin/python.
Вторым действием, для упрощения запуска сценария. необходимо установить права доступа к файлу сценария, разрешающие выполнять его как обычную команду. Для этого воспользуемся командой chmod, как показано ниже:
user@computer$ chmod +x first_scenario
Теперь для запуска сценария достаточно воспользоваться следующей строкой
user@computer$ ./first-scenario
Hello World
/usr/bin/neqn
#! /bin/sh
# Copyright (C) 2014 Free Software Foundation, Inc.
#
# This file is part of groff.
#
# groff is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 2 of the License (GPL2).
#
# groff is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# The GPL2 license text is available in the internet at
# http://www.gnu.org/licenses/gpl-2.0.txt.
# Provision of this shell script should not be taken to imply that use of
# GNU eqn with groff -Tascii|-Tlatin1|-Tutf8|-Tcp1047 is supported.
GROFF_RUNTIME=»${GROFF_BIN_PATH=/usr/bin}:»
PATH=»$GROFF_RUNTIME$PATH»
export PATH
exec eqn -Tascii ${1+»$@»}
# eof
Резюме
В этой статье рассмотрели как создаются сценарии командной оболочки. Если вы до этого не занимались написанием сценариев, то теперь у вас должно сложится небольшое представление о том, как это работает. Умение писать сценарии на языке bash встречается в 99% описания вакансий, связанных с администрированием ОС Linux. Поэтому, я считаю, это необходимое умение, которое как говорится маст хэв.
В этой статье рассмотрели как создаются сценарии командной оболочки. Если вы до этого не занимались написанием сценариев, то теперь у вас должно сложится небольшое представление о том, как это работает. Умение писать сценарии на языке bash встречается в 99% описания вакансий, связанных с администрированием ОС Linux. Поэтому, я считаю, это необходимое умение, которое как говорится маст хэв.
Ну, а чтобы не пропустить новые статьи про bash, подписывайтесь на мой канал дзен (кнопка ниже), либо в telegrmm и ВКонтакте. Так же не забудьте про мой сайт RoadIT, в котором я потихоньку собираю материал, знание которого приведет вас в мир IT.