Вся сила Linux в использовании терминала. Это такая командная оболочка, где вы можете выполнять различные команды, которые будут быстро и эффективно выполнять различные действия. Ну впрочем, вы наверное это уже знаете. Для Linux было создано множество скриптов, которые выполняются в различных командных оболочках. Это очень удобно, вы просто объединяете несколько команд, которые выполняют определенное действие, а затем выполняете их одной командой или даже с помощью ярлыка.
Но у новичков может возникнуть вопрос — как запустить скрипт в Linux, что для этого нужно сделать, что будет происходить и какие команды нужно выполнить. Но сначала нужно рассмотреть как работают скрипты и что такое исполняемость.
Как работают скрипты
В Linux почти не используется расширение файла для опережения его типа на системном уровне. Это могут делать файловые менеджеры и то не всегда. Вместо этого, используются сигнатуры начала файла и специальные флаги. Система считает исполняемыми только те файлы, которым присвоен атрибут исполняемости.
Как запустить sh (shell) скрипт в терминале Ubuntu
Теперь о том, как работают скрипты. Это обычные файлы, которые содержат текст. Но если для них установлен атрибут исполняемости, то для их открытия используется специальная программа — интерпретатор, например, оболочка bash. А уже интерпретатор читает последовательно строку за строкой и выполняет все команды, которые содержатся в файле.
У нас есть несколько способов выполнить запуск скрипта linux. Мы можем запустить его как любую другую программу через терминал или же запустить оболочку и сообщить ей какой файл нужно выполнять. В этом случае не нужно даже флага исполняемости.
Запуск скрипта sh в Linux
Сначала рассмотрим пример небольшого sh скрипта:
#!/bin/bash
echo «Hello world»
Вторая строка — это действие, которое выполняет скрипт, но нас больше всего интересует первая — это оболочка, с помощью которого его нужно выполнить. Это может быть не только /bin/bash, но и /bin/sh, и даже /usr/bin/python или /usr/bin/php. Также часто встречается ситуация, что путь к исполняемому файлу оболочки получают с помощью утилиты env: /usr/bin/env php и так далее. Чтобы выполнить скрипт в указанной оболочке, нужно установить для него флаг исполняемости:
chmod ugo+x script.sh
Как запустить программу shell
Программа, интерпретирующая shell-программы, находится в файле /bin/sh. При запуске ее первый аргумент является именем shell-программы, остальные передаются как позициональные параметры. Если файл, содержащий shell-программу, имеет право выполнения (x), то достаточно указания лишь его имени. Например, следующие две команды операционной системы эквивалентны (если файл ficofl обладает указанным правом и на самом деле содержит shell-программу):
Скрипты PowerShell с нуля. Уроки для начинающих
sh ficofl -d . g* и ficofl -d . g*
4.2. Выполнение
При выполнении shell-программ выполняются все подстановки. Если имя команды совпадает с именем специальной команды, то она выполнается в рамках текущего процесса.
Так же выполняются и определенные пользователем функции. Если имя команды не совпадает ни с именем специальной команды, ни с именем функции, то порождается новый процесс и осуществляется попытка выполнить указанную команду.
Переменная PATH определяет путь поиска директории, содержащей данную команду. По умолчанию это
::/bin:/usr/ bin:/util:/dss/rk
Директории поиска разделяются двоеточиями; :: означает текущую директорию. Если имя команды содержит символ /, значение $PATH не используется: имена, начинающиеся с / ищутся от корня, остальные — от текущей директории. Положение найденной команды запоминается shellом и может быть опрошено командой hash.
4.3. Окружение
Окружение — это набор пар имя-значение, которые передаются выполняемой программе. Shell взаимодействует с окружением несколькими способами. При запуске shell создает переменную для каждой указанной пары, придавая ей соответствующее значение.
Если вы измените значение какой-либо из этих переменных или создадите новую переменную, то это не окажет никакого влияния на окружение, если не будет использована команда export для связи переменной shell’а с окружением (см. также set -a). Переменная может быть удалена из окружения командой unset (см.). Таким образом, окружение каждой из выполняемых shell’ом команд формируется из всех неизмененных пар имя-значение, первоначально полученных shell’ом, минус пары, удаленные командой unset, плюс все модифицированные и измененные пары, которые для этого должны быть указаны в команде export.
Окружение простых команд может быть сформировано указанием перед ней одного или нескольких присваиваний переменным. Так,
TERM=d460 и (export TERM; TERM=d460; )
эквивалентны. Переменные, участвующие в таких присваиваниях, назовем ключевыми параметрами.
Если установлен флаг -k (см. set), то все ключевые параметры помещаются в окружение команды, даже если они записаны после команды.
4.4. Сигналы
UNIX’ом поддерживаются следующие сигналы:
SIGHUP | — 1 — | отменить (hangup) |
SIGINT | — 2 — | прерывание (interrupt) |
SIGQUIT | — 3 — | нестандартный выход (quit) |
SIGILL | — 4 — | неверная команда (illegal instruction) |
SIGTRAP | — 5 — | ловушка (trace trap) |
SIGFPE | — 8 — | исключительная ситуация при выполнении операций с плавающей запятой (floating-point exception) |
SIGKILL | — 9 — | уничтожение процесса (kill) |
SIGBUS | — 10 — | ошибка шины (bus error) |
SIGSEGV | — 11 — | нарушение сегментации (segmentation violation) |
SIGSYS | — 12 — | неверный системный вызов (bad argument to system call) |
SIGPIPE | — 13 — | запись в канал без чтения из него (write on a pipe with no one to read it) |
SIGALRM | — 14 — | будильник (alarm clock) |
SIGTERM | — 15 — | программное завершение процесса (software termination signal) |
Сигналы SIGINT и SIGQUIT игнорируются, если команда была запущена асинхронно. Иначе сигналы обрабатываются так же, как в процессе-предке, за исключением сигнала SIGSEGV (см. также Специальные команды. Trap).
4.5. Замечания
При выполнении команд запоминается их местонахождение. Поэтому при создании команды с тем же именем, но находящейся в другой директории, все равно будет выполняться старая команда (если вызов происходит по короткому имени). Для исправления ситуации воспользуйтесь командой hash с ключом -r (см. Специальные команды).
Если вы переименовали текущую или вышележащую директорию, то команда pwd может давать неверную информацию. Для исправления ситуации воспользуйтесь командой cd с полным именем директории.
5. Дополнительные сведения
5.1. Команда test
Команда test применяется для проверки условия. Формат вызова:
test или [ ]
Команда test вычисляет и, если его значение — истина, возвращает код завершения 0 (true); иначе — ненулевое значение (false). Ненулевой код завершения возвращается и если опущены аргументы. может состоять из следующих примитивов:
-r файл | — истина, если файл существует и доступен для чтения |
-w файл | — истина, если файл существует и доступен для записи |
-x файл | — истина, если файл существует и является выполняемым |
-f файл | — истина, если файл существует и является обычным файлом |
-d файл | — истина, если файл существует и является директорией |
-c файл | — истина, если файл существует и является специальным символьно-ориентированным файлом |
-b файл | — истина, если файл существует и является специальным блок-ориентированным файлом |
-p файл | — истина, если файл существует и является именованным каналом (pipe) |
-s файл | — истина, если файл существует и имеет ненулевую длину |
-t [ дескриптор файла ] | — истина, если открытый файл с указанным дескриптором (по умолчанию 1) существует и ассоциирован с терминалом |
-z s1 | — истина, если длина строки s1 нулевая |
-n s1 | — истина, если длина строки s1 ненулевая |
s1 = s2 | — истина, если строки s1 и s2 совпадают |
s1 != s2 | — истина, если строки s1 и s2 не совпадают |
s1 | — истина, если s1 непустая строка |
n1 -eq n2 | — истина, если целые n1 и n2 алгебраически совпадают . На месте -eq могут быть также -ne, -gt, -ge, -lt, -le |
5.2. Команда expr
Команда expr применяется для вычисления выражений. Результат выводится на стандартный вывод. Операнды выражения должны быть разделены пробелами. Метасимволы должны быть экранированы. Надо заметить, что 0 возвращается в качестве числа, а не для индикации пустой строки.
Строки, содержащие пробелы или другие специальные символы, должны быть заключены в кавычки. Целые рассматриваются как 32-битные числа.
Ниже приведен список операторов в порядке возрастания приоритета, операции с равным приоритетом заключены в фигурные скобки. Перед символами, которые должны быть экранированы, стоит .
| | если первое не пустое и не нулевое, то возвращает его, иначе возвращает второе |
=, >, >=, | возвращает результат целочисленного сравнения если оба — целые; иначе возвращает результат лексического сравнения |
< +, — > | сложение и вычитание целочисленных аргументов |
< *, /, % > | умножение, деление и получение остатка от деления целочисленных аргументов |
: | оператор сопоставления : сопоставляет первый аргумент со вторым, который должен быть регулярным выражением. Обычно оператор сравнения возвращает число символов, удовлетворяющих образцу (0 при неудачном сравнении). Однако символы ( и ) могут применяться для выделения части первого аргумента. |
Регулярное выражение строится следующим образом:
. | — обозначает любой символ |
* | — обозначает предыдущий символ, повторенный несколько раз |
[] | — обозначают любой один из указанных между ними символов; группа символов может обозначаться с помощью знака «-» (т.е. [0-9] эквивалентно [0123456789]); если после [ стоит ^, то это эквивалентно любому символу, кроме указанных в скобках и ; для указания ] в качестве образца, надо поставить ее сразу за [ (т.е. []. ]); . и * внутри квадратных скобок обозначают самих себя |
Все остальные символы (и ^, если стоит не в квадратных скобках) обозначают самих себя. Для указания символов ., *,[ и ] надо экранировать их (т.е. писать ., *, [, ]).
Примеры.
a=`expr $a + 1`
— увеличение на 1 переменной a
expr $a : ‘.*/(.*)’ | $a
— выделяет из имени файла короткое имя (т.е. из /usr/util/ena выделяется ena). Внимание, одиночный символ / будет воспринят как знак операции деления.
expr $VAR : ‘.*’
— получение количества символов переменной VAR.
В качестве побочного эффекта expr возвращает следующие коды завершения:
— если выражение не нуль и не пустая строка | |
1 | — если выражение нуль или пустая строка |
2 | — для некорректных выражений |
Команда expr также выдает следующие сообщения об ошибках:
syntax error | — для ошибок в операторах или операндах |
non-numeric argument | — для попыток применения арифметических операций к нечисловым строкам |
Замечание.
Допустим, что мы хотим сравнить значение переменной a с каким-либо символом, имеющим для expr особый смысл, например, со знаком равенства. Пусть $a на самом деле является знаком равенства. Так как аргументы предварительно обрабатываются shell’ом, то команда
expr $a = ‘=’
будет воспринята как
expr = = =
что синтаксически некорректно. В подобных случаях надо пользоваться таким приемом:
expr X$a = X=
т.е. добавлением некоторого символа к обеим строкам, что никак не влияет на результат сравнения, однако позволяет избежать синтаксической ошибки.
5.3. Команда ena
Команда ena позволяет получить части полного имени файла. Первый аргумент — флаг, второй — имя файла. Команда различает следующие флаги:
-n | — имя файла без расширения |
-f | — имя файла с расширением |
-e | — расширение |
-d | — имя директории |
-p | — если имя файла начинается с . или .. , то эти символы выделяются из имени |
Ниже приводится текст программы ena, хранящийся в /util/ena.
# Get part of pathname case $1 in -n ) expr $2 : ‘.*/(.*)[.].*’ | $2 : ‘(.*)[.].*’ | $2 ;; -f ) expr $2 : ‘.*/(.*)’ | $2 ;; -e ) expr $2 : ‘.*([.][^./]*)’ | ‘ ‘ ;; -d ) expr $2 : ‘(.*)/.*’ | $2 ;; -p ) expr $2 : ‘([.])/.*’ | $2 : ‘([.][.])/.*’ | ‘ ‘ ;; * ) echo «error: unknown part of pathname $1» exit 2 ;; esac
Источник: www.linuxlib.ru
Создайте и запустите свой первый скрипт Bash Shell
С делайте первый шаг к созданию сценариев оболочки. Узнайте, что нужно для создания простого bash-скрипта и как его запустить.
Если вам нужно сделать это более одного раза, автоматизируйте это!
Вы часто будете повторять одну и ту же задачу в Linux снова и снова. Это может быть простая резервная копия каталога, очистка временных файлов или даже клонирование базы данных.
Автоматизация задачи — один из многих полезных сценариев, в которых вы можете использовать возможности сценариев bash.
Позвольте нам показать вам, как создать простой скрипт оболочки bash, как запустить скрипт bash и что вы должны знать о сценариях оболочки.
Создайте и запустите свой первый скрипт оболочки
Давайте сначала создадим новый каталог с именем scripts, который будет содержать все наши скрипты bash.
mkdir scripts cd scripts
Теперь внутри этого «каталога скриптов» создайте новый файл с именем hello.sh с помощью команды cat:
cat > hello.sh
Вставьте в него следующую строку, набрав ее в терминале:
echo ‘Hello, World!’
Вы также можете использовать текстовый редактор на основе терминала, такой как Vim, Emacs или Nano. Если вы используете настольный Linux, вы также можете использовать графический текстовый редактор, такой как Gedit, чтобы добавить текст в этот файл.
Итак, в основном вы используете команду echo для вывода «Hello World». Вы можете использовать эту команду непосредственно в терминале, но в этом тесте вы запустите эту команду через скрипт оболочки.
chmod u+x hello.sh
И наконец, запустите ваш первый скрипт оболочки, добавив hello.sh желаемую оболочку «bash»:
bash hello.sh
Вы увидите Hello, World!, напечатанные на экране. Возможно, это была самая легкая программа Hello World, которую вы когда-либо писали, верно?
Конвертируйте ваш скрипт в bash
Bash означает “Bourne-Again shell”, — это всего лишь одна из многих доступных оболочек в Linux.
Читать Команды break и continue. Оболочка Bash. Linux.
Оболочка — это интерпретатор командной строки, который принимает и запускает команды. Если вы когда-либо запускали какую-либо команду Linux раньше, то вы использовали оболочку. Когда вы открываете терминал в Linux, вы уже используете оболочку по умолчанию вашей системы.
Bash часто является оболочкой по умолчанию в большинстве дистрибутивов Linux. Вот почему bash часто является синонимом оболочки.
Сценарии оболочки часто имеют почти одинаковые синтаксисы, но иногда они также различаются. Например, индекс массива начинается с 1 в Zsh вместо 0 в bash. Скрипт, написанный для оболочки Zsh , не будет работать так же в bash, если у него есть массивы.
Чтобы избежать неприятных сюрпризов, вы должны сообщить интерпретатору, что ваш сценарий оболочки написан для оболочки bash.
Строка SheBang в начале сценария оболочки
Строка «#!/Bin/bash» называется строкой shebang, а в некоторых литературах она называется строкой hashbang, и это потому, что она начинается с двух символов хеша «#» и bang «!».
#! /bin/bash echo ‘Hello, World!’
Когда вы добавляете строку «#!/Bin/bash» в самом верху вашего скрипта, система знает, что вы хотите использовать bash в качестве интерпретатора для вашего скрипта. Таким образом, вы можете запустить скрипт hello.sh прямо сейчас, не добавляя ему bash.
Добавление сценария оболочки в PATH (чтобы его можно было запустить из любого каталога)
Возможно, вы заметили, что мы использовали ./hello.sh для запуска скрипта; вы получите ошибку, если пропустите ведущий ./
Bash подумал, что вы пытаетесь запустить команду с именем hello.sh. Когда вы запускаете любую команду на вашем терминале; он ищет эту команду в наборе каталогов, которые хранятся в переменной PATH.
Вы можете использовать echo для просмотра содержимого этой переменной PATH:
echo $PATH /home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Символ двоеточия (:) разделяет путь каждого из каталогов, которые сканирует ваша оболочка при каждом запуске команды.
Команды Linux, такие как echo, cat и т. д., можно запускать откуда угодно, потому что их исполняемые файлы хранятся в каталогах bin. Каталоги bin включены в PATH. Когда вы запускаете команду, ваша система проверяет PATH на все возможные места, которые она должна искать, чтобы найти исполняемый файл для этой команды.
Читать Заявление Case в Bash
Если вы хотите запустить свой bash-скрипт из любой точки мира, как если бы это была обычная команда Linux, добавьте местоположение вашего сценария оболочки в переменную PATH.
Во-первых, найдите местоположение каталога вашего скрипта (если вы находитесь в том же каталоге), используйте команду PWD:
Используйте команду export, чтобы добавить каталог скриптов в переменную PATH.
export PATH=$PATH:/home/user/scripts
Обратите внимание, что мы добавили «каталог скриптов» в самый конец нашей переменной PATH. Так что пользовательский путь ищется после стандартных каталогов.
Момент истины здесь, запустите hello.sh:
Он работает! Это подводит нас к концу этой статьи. Мы надеемся, что теперь у вас есть некоторое представление о сценариях оболочки.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник: andreyex.ru