Bash скрипты в операционной системе Linux

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

Bash скрипты Linux для чайников

Конструкцию bash допускается описать в 7 обязательствах подобным типом: «вызов командного интерпретатора — тело bash скрипта — окончание скрипта». Сочиняются скрипты с поддержкой различного текстового редактора, хранятся они как текстовые компьютерные данные. Но, чтобы было комфортнее, я храню их в совокупности с расширением «*.sh». Но давайте поглядим на все это на образце определенной цели. Есть использование, которое нужно запускать с достаточно большим комплектом характеристик. Стартовать потребуется зачастую, а каждый раз вводить эти характеристики лень. Чтоб являлось определеннее, поглядим, как выглядит это воздействие:

/home/Admin/soft/sgconf/sgconf -s -p 5555 -a Admin -w 112233 -u user -c 100

Для этого script-a давайте использовать интерпретатор bash. Первостепенным процессом нам с вами необходим вызов интерпретатора. Открываем текстовый редактор и пишем код.

/bin/bash

Добавим эту операцию с учетом введенных переменных:

/home/Admin/soft/sgconf/sgconf -s -p 5555 -a Admin -w 112233 -u $user -c $cash

Текст, который будем вносить в логи будет таким:text=»Баланс пользователя «user» пополнен на «cash» рублей в time»

Аргумент text варьируется в связи от переменных user, cash и time

if [ -e /home/Admin/scripts/sgconf/] then echo text >> /home/Admin/scripts/sgconf/ else echo text > /home/Admin/scripts/sgconf/

Теперь, когда нам нужно положить кому-нибудь денежку, мы запускаем скрипт командой «sh », вводим имя плательщика и сумму платежа. Никаких длинных строчек, никакой головной боли с постоянным вводом одних и тех же значений.

Решение

Собственно задача до безобразия простая. Написать скрипт, который будет копировать файл можно за минуту. Мы знаем, что команда для копирования файлов в shell cp. Потому, сделав cp /usr/dir1/* /usr/dir2 мы скопируем все файлы в нужный каталог. Но как мы узнаем о том, что это уже произошло? Ведь главное преимущество UNIX-систем заключается в том, что человек командует этой ОС, а не ОС человеком. Соответственно, мы хотим видеть всё, что происходит в нашей системе.

Как нам известно, имеется три файловых дескриптора:

  • стандартный ввод
  • стандартный вывод
  • стандартный вывод ошибки

Можно, конечно, открыть и другие потоки вывода. Shell имеет богатые средства для манипулирования ими. Итак вот они (file — это файл, в который мы будем писать сообщения из скрипта):

  • >file — Перенаправление стандартного вывода в файл file
  • >>file — Перенаправление стандартного вывода в file, но при этом старые записи удаляться не будут,. Новые записи будут добавлять к старым в конец файла
  • <file — Перенаправление стандартного ввода из файла file
  • proc1|proc2 — Перенаправление стандартного вывода процесса proc1 на стандартный ввода proc2
  • n>file — Перенаправление дескриптора с номером n в файл file
  • n>>file — То же самое, но с добавление в конец файла
  • n<&n2 — Слияние потоков с дескрипторов n1 и n2
  • <<string — Ввод до подстроки string (<<ввод здесь>>)
Читайте также:  3 простых способа сохранить веб-страницу в PDF

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

Кстати, могу заметить, что шебанг #!/bin/sh справедлив и для оболочки ~bash. Обычно в ~bash делается символическая ссылка и шебанг #!/bin/sh равнозначен #!/bin/bash.

Итак, вот код нашего скрипта: каким бы он был, если бы мы кроме копирования ничего от него не требовали бы:

#!/bin/shcp /usr/dir1/*/usr/dir2

Всё. Больше ничего писать не надо, и мы могли бы оставить так, но нам нужно протоколировать этот процесс. Для этого вносим дополнения в скрипт, чтобы знать, что скрипт действительно выполнился:

echo «Сообщение» >>/usr/logs/file

и после этого, каждый раз, когда скрипт будет выполняться, в нашем файле лога (/usr/logs/file) будут появляться новые записи.

Итак, скрипт теперь будет выглядить вот так:

#!/bin/shecho «Начинаем копирование файла» >> /usr/logs/filecp /usr/dir1/* /usr/dir2echo «Скрипт выполнен и остановлен»>> /usr/logs/filecd /usr/dir2ls >> /usr/logs/file

Теперь, если мы поместим файл скрипта в cron, где укажем ему запускаться каждую минуту, и открыв файл /usr/logs/file с помощью команды tail -f, то бишь # tail -f /usr/logs/file, в нашем окне будет видно, как происходит копирование файлов из директории /usr/dir1 в директорию /usr/dir2 с уведомлением о том, что скрипт запущен и остановлен. Если при копировании возникнет какая-то ошибка и файл скопирован не будет, то вы не увидите последней строки, а значит, скрипт отработал не до конца и в какой-то строке ошибка.

Последняя строка покажет нам, что находится в каталоге, в который мы копировали. Для более подробного процесса логирования можно применить оператор test и применить конструкцию выбора if-fi, но о них позже напишу. Оператор test умеет анализировать файлы и каталоги. А на основе результата анализа можно будет делать выбор.

Таким образом, всё что ты хочешь логировать в каком-то файле, можешь реализовать это с помощью дескриптора >>.

Через месяц, когда файл станет огромен, мы его заархивируем с помощью другого скрипта, и почистим для новых записей. Всё это также реализуется на скриптах. Тут уже включайте свою фантазию, как это сделать 🙂

Я показал понятный пример использования логирования наших скриптов. Остальное ты должен узнать сам, как делать, так как простой «копи-паст» не желателен. Теперь только я могу делать «копи-паст» из этой статьи 🙂

Удачи тебе, начинающий сисадмин 🙂

Ссылки:

Вызов команд из истории

В моем случае это снова запустил ls -lrt, как вы можете видеть из вывода моей истории, это было на шесть команд выше моей последней команды.

Читайте также:  Команда wall в Linux

Вы также можете использовать «!» как своего рода поиск. Используя мой пример истории bash, скажем, я хотел запустить последний цикл for, который был запущен. Вы можете использовать «! -14», но трудно вспомнить, сколько команд было назад, по крайней мере, для меня. Вместо этого мы можем сказать bash просто выполнить последнюю команду, начинающуюся с «for», вот так:

Пример:

[email protected]:~$ !for for i in `cat names`; do echo -n «FORWARD: $i — REVERSE: «; dig +short $i; done

Вы также можете указать по номеру, какую команду вы хотите запустить. Например, я хотел запустить команду 18 в приведенном выше примере. Используя восклицательный знак, сделать это можно так:

Например:

[email protected]:~$ !18 freshclam

Как выполнять код интерактивно

Есть больше 4 способов запустить Python-скрипт интерактивно. Рассмотрим их все подробно.

Использование import для запуска скриптов

Импорт модулей для загрузки скриптов и библиотек используется постоянно. Можно даже написать собственный скрипт (например ) и импортировать его в другой файл без необходимости повторять то же самое.

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

Копировать Скопировано Use a different Browser

>>> import code1

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

Предположим, что внутри файла есть маленькая функция, например chart_code1(), которая рисует красивый график. И нужна только она. Вместо того чтобы взывать весь скрипт целиком, можно вызвать ее.

Вот как это обычно делается.

Копировать Скопировано Use a different Browser

>>> from code1 import chart_code1

Теперь появляется возможность использовать chart_code1 в новом файле так, будто бы эта функция была написана здесь.

Использование importlib для запуска кода

import_module() из importlib позволяет импортировать и исполнять другие Python-скрипты.

Это работает очень просто. Для скрипта нужно сделать следующее:

Копировать Скопировано Use a different Browser

import importlib _module(‘code1’)

И нет необходимости добавлять .py в import_module().

Разберем случай, когда есть сложная структура папок, и нужно использовать importlib. Предположим, что структура следующая:

level1 | +– __init__.py – level2 | +– __init__.py –

В таком случае, написав, например, _module(«level3»), вы получите ошибку. Это называется относительным импортом и работает за счет явного использования относительного пути.

Так, для запуска скрипта можно написать так:

Копировать Скопировано Use a different Browser

_module(‘.level3’, ») # или так _module(»)

Запуск кода с помощью runpy

Модуль runpy ищет и исполняет Python-скрипт без импорта. Он также легко используется, ведь достаточно просто вызывать имя модуля в run_module().

Вот как, например, выполнить с помощью runpy.

Копировать Скопировано Use a different Browser

>>> import runpy >>> _module(mod_name=»code1″)

Запуск кода динамически

Рассмотрим функцию exec(), которая также используется для динамического выполнения скриптов. В Python2 эта функция была инструкцией.

Читайте также:  Восстановление данных с поврежденных дисков CD, DVD

Вот как она помогает выполнять код динамически на примере строки.

Копировать Скопировано Use a different Browser

>>> print_the_string = ‘print(«Выполнен динамический код»)’ >>> exec(print_the_string)

Однако этот способ уже устарел. Он медленный и непредсказуемый, а Python предлагает массу других вариантов.

Работа с переменными

Самый распространенный способ хранения начальных данных — переменные. В самом начале программы объявляются несколько таких переменных, в которые пользователь записывает некоторые исходные данные.

Список зарезервированных переменных:

$DIRSTACK — содержимое вершины стека каталогов

$EDITOR — текстовый редактор по умолчанию

$EUID — эффективный UID, если используется программа su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя

$UID — реальный идентификатор, который устанавливается только при логине

$FUNCNAME — имя текущей функции в скрипте

$GROUPS — массив групп к которым принадлежит текущий пользователь

$HOME — домашний каталог пользователя

$HOSTNAME — ваш hostname

$HOSTTYPE — архитектура машины

$LC_CTYPE — внутренняя переменная, которая определяет кодировку символов

$OLDPWD — прежний рабочий каталог

$OSTYPE — тип ОС

$PATH — путь поиска программ

$PPID — идентификатор родительского процесса

$SECONDS — время работы скрипта(в сек.)

$# — общее количество параметров переданных скрипту

$* — все аргументы, переданные скрипту (выводятся в строку)

[email protected] — все аргументы, переданные скрипту (выводятся в столбик)

$! — PID последнего запущенного в фоне процесса

$$ — PID самого скрипта

Пример работы с переменными и конфигурационным файлом

#!/bin/bash[email protected]#Вписать адрес электронной почтыecho «Адрес электронной почты: $EMAIL»

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

Необходимо ясно известить пользователя о том, что и где ему необходимо вписать. Желательно собрать все это в одном месте — файле конфигурации. Подключить его можно командой source. Например, если конфигурационный файл будет лежать в той же директории, что и скрипт, мы получим:

#!/bin/bashsource ./echo «Адрес электронной почты: $EMAIL»

В файл не забудем поместить строчку: Е[email protected]

Пример работы с математическими операциями

Для работы с математическими операциями используется команда let, которая производит арифметические операции над числами и переменными.

Содержимое исполняемого файла:

#!/bin/bashecho «Введите a: «read aecho «Введите b: «read blet «c = a + b» #сложениеecho «a+b= $c»let «c = a / b» #делениеecho «a/b= $c»

Обновите название исполняемого файла, нажав сочетание клавиш CTRL+O, например, пусть он будет называться math, после чего нажмите клавишу Enter.

Сделайте файл исполняемым:

chmod +x math

Запустите файл:

math

Результат выполнения должен выглядеть следующим образом:

Введите a:

123

Введите b:

a+b= 135

a/b= 10

Список математических операций:

+ — сложение

— — вычитание

* — умножение

/ — деление

% — модуль (деление по модулю), остаток от деления

Команда let позволяет использовать сокращения арифметических команд, тем самым сокращая количество используемых переменных, например: a = a+b эквивалентно a +=b.