🎩 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 сигнализирует терминалу о том, что ввод завершён. Если терминал пустой, это приведёт к завершению текущей сессии.

Оригиналы источников информации.

  1. qna.habr.com — Как запустить sh скрипты в Linux?
  2. superuser.com What is the difference between bash and sh?

Вам может также понравиться...