🎩 Bash: Как запускать shell (*.sh) скрипты?
Что такое Shell.
Вся сила GNU\Linux в использовании терминала. Это такая командная оболочка, где вы можете выполнять различные команды, которые будут быстро и эффективно выполнять различные действия.
Для GNU\Linux было создано множество скриптов, которые выполняются в различных командных оболочках. Это очень удобно, вы просто объединяете несколько команд, которые выполняют определенное действие, а затем выполняете их одной командой или даже с помощью ярлыка.
Shell — это один из командных интерпретаторов, поставляемых вместе с GNU\Linux. Программа на языке называется скриптом. Shell скриптам указывают расширение *.sh
и работают они в GNU\Linux системах.
Когда вы видите:
#!/usr/bin/sh
и
#!/user/bin/bash
Просто имейте в виду, что командная оболочка sh
старше, чем командная оболочка bash
.
Так же командная оболочка bash
является надмножеством командной оболочки sh
, то есть все, что вы можете сделать sh
вы можете также сделать и в bash
. Во многих дистрибутивах GNU\Linux, ссылку /bin/sh
можно интерпретировать как ссылку на /bin/bash
.
Например, bash
имеет больше функций (ветвление, встроенные массивы), что упрощает написание сценариев, а в /bin/sh
нет истории или редактирования командной строки и еще нет контроля задания.
Существует множество других командных оболочек для GNU\Linux, которые мы не будем рассматривать в рамках данной инструкции.
Как работают скрипты.
В GNU\Linux почти не используется расширение файла для опережения его типа на системном уровне. Это могут делать файловые менеджеры и то не всегда. Вместо этого, используются сигнатуры начала файла и специальные флаги.
Система считает исполняемыми только те файлы, которым присвоен атрибут исполняемости.
Теперь о том, как работают скрипты. Это обычные файлы, которые содержат текст, но если для них установлен атрибут исполняемости, то для их открытия используется специальная программа — интерпретатор, например, оболочки sh
или bash
, а уже интерпретатор читает последовательно строку за строкой и выполняет все команды, которые содержатся в файле.
У нас есть несколько способов выполнить запуск скрипта GNU\Linux. Мы можем запустить его как любую другую программу через терминал или же запустить оболочку и сообщить ей какой файл нужно выполнять. В этом случае не нужно даже флага исполняемости.
Как запустить sh скрипт из командной строки?
Допустим у вас есть скрипт hello.sh
состоящий из одной команды.
# cd ~ # mcedit hello.sh
Содержимое:
echo "Hello World"
Чтобы его запустить, надо зайти в каталог, где расположен скрипт, набрать название интерпретатора sh
и первым параметров указать ваш файл hello.sh
.
# sh hello.sh
Ответ:
Чтобы каждый раз не указывать интерпретатор в терминале, можно сделать скрипт исполняемым.
Указать интерпретатор внутри файла.
Если указать интерпретатор внутри файла, чтобы постоянно не указывать интерпретатор в терминале, можно сделать скрипт исполняемым.
На первой строчке после #!
прописываем путь к bash-интерпретатору, по умолчанию это /usr/bin/bash
(посмотреть можно командой whereis bash
).
# whereis bash
Ответ:
Вторая строка — это действие, которое выполняет скрипт, но нас больше всего интересует первая строка — это оболочка, с помощью которого скрипт нужно выполнить.
Это может быть не только /usr/bin/bash
, но и /bin/bash
или /bin/sh
, и даже /usr/bin/python
или /usr/bin/php
. Также часто встречается ситуация, что путь к исполняемому файлу оболочки получают с помощью утилиты env
, например, /usr/bin/env
, php
и так далее.
# cd ~ # mcedit script.sh
Содержимое скрипта script.sh
получается таким:
#!/usr/bin/bash
echo "Hello World"
Сделать наш файл исполняемым.
Нужно просто осознать, что в GNU\Linux не существует ассоциаций файлов по расширениям.
Расширение для GNU\Linux — просто часть файла после последней точки, система никаких действий к этому не привязывает.
Поэтому единственный способ делать .sh
файлы исполняемыми — ставить на них флаг executable
.
Чтобы выполнить скрипт в указанной оболочке, нужно установить для него флаг исполняемости.
Для этого используется команда chmod +x
и имя файла скрипта.
Например, запустим от суперпользователя:
$ sudo chmod +x script.sh
или так
$ sudo chmod ugo+x script.sh
При установке прав с помощью символов используются группы символов:
- Кому будет предоставляться или запрещаться доступ: владельцу (
u
), группе (g
), остальным (o
) или всем (a
). Можно указать как одну, так сразу несколько категорий. - Какие действия: чтение (
r
), запись (w
), исполнение (x
).
Можно указывать сразу несколько прав.
Для обозначения запрещения, разрешения или назначения права используется один из символов: «-
», «+
» или «=
».
Мы разрешаем выполнять запуск sh
операционной системе GNU\Linux всем категориям пользователей — владельцу, группе файла и остальным.
Следующий важный момент — это то место где находится скрипт, если вы просто наберете script.sh
, то поиск будет выполнен только глобально, в каталогах, которые записаны в переменную PATH
и даже если вы находитесь сейчас в том же каталоге где находится скрипт, то он не будет найден. К нему нужно указывать полный путь, например, для того же текущего каталога.
Запуск скрипта sh
в GNU\Linux:
# ./script.sh
Ответ:
Перед названием скрипта надо ставить точку и слэш ./
, сделано для усложнения работы вирусов.
Точка означает «текущий каталог
», а слэш «/
» — «разделитель между именем каталога и именем скрипта».
Или полный путь от корня:
# /root/script.sh
Ответ:
Если вы не хотите писать полный путь к скрипту, это можно сделать, достаточно переместить скрипт в одни из каталогов, которые указаны в переменной PATH
. Одна из них, которая предназначена для ручной установки программ — /usr/local/bin
.
# ln -s /root/script.sh /usr/local/bin/script.sh
Теперь вы можете выполнить запуск скрипта просто с упоминания названия, на которое ссылается на файл скрипта:
# cd /home/ # script.sh
Ответ:
Это был первый способ вызвать скрипт, но есть еще один — мы можем запустить оболочку и сразу же передать ей скрипт, который нужно выполнить. Вы могли редко видеть такой способ с bash
, но он довольно часто используется для скриптов php
или python
.
Другой вариант — запускать сам bash
с передачей ему файла как аргумент, потому что бинарник bash’а уже с флагом исполняемости executable
.
# bash script.sh
Ответ:
А если нам нужно запустить скрипт на php
, то выполните:
# php script.php
Запуск скрипта в фоновом режиме.
Так можно запустить скрипт как фоновый процесс, используйте символ &
:
# script.sh &
Ответ:
Выйти из программы можно как с помощью Ctrl + С, так и Ctrl + D.
Ctrl + C в GNU/Linux используется для прерывания текущего выполняющегося процесса в терминале. Если какая-либо команда начинает вести себя не так, как ожидается, или нужно прервать выполнение, достаточно нажать Ctrl + C.
Ctrl + D используется для выхода из терминала или завершения ввода данных. Когда пользователь находится в процессе ввода команд или текста, нажатие Ctrl + D сигнализирует терминалу о том, что ввод завершён. Если терминал пустой, это приведёт к завершению текущей сессии.
Оригиналы источников информации.
- qna.habr.com — Как запустить sh скрипты в Linux?
- superuser.com What is the difference between bash and sh?