Код, написанный на языке 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
Добавим эту операцию с учетом введенных переменных:
- Bash Shell
- Написание скриптов на Bash | Losst
- Shell скрипт в Windows 10 …
- Запуск скрипта sh в Linux | Losst
/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 (<<ввод здесь>>)
Собственно вся необходимая нам информация, которой мы будем оперировать есть, теперь осталось внедрить нашу задачу в жизнь. Итак, мы хотим видеть, как происходило копирование файла из одной директории в другую. Для этого создаём файл и делаем его исполняемым скриптом. Как это делать рассказано в прошлой теме. Читать прошлую тему
Кстати, могу заметить, что шебанг #!/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, как вы можете видеть из вывода моей истории, это было на шесть команд выше моей последней команды.
Вы также можете использовать «!» как своего рода поиск. Используя мой пример истории bash, скажем, я хотел запустить последний цикл for, который был запущен. Вы можете использовать «! -14», но трудно вспомнить, сколько команд было назад, по крайней мере, для меня. Вместо этого мы можем сказать bash просто выполнить последнюю команду, начинающуюся с «for», вот так:
Пример:
[email protected]:~$ !for for i in `cat names`; do echo -n «FORWARD: $i — REVERSE: «; dig +short $i; done
- shell в google Colab …
- Bash Shell Script …
- в Linux
- Как запустить скрипт shell в OS X …
Вы также можете указать по номеру, какую команду вы хотите запустить. Например, я хотел запустить команду 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 эта функция была инструкцией.
Вот как она помогает выполнять код динамически на примере строки.
Копировать Скопировано 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»
- Bash-скрипты: начало / Блог компании …
- Git Bash для Windows из Eclipse …
- Bash Shell
- Конспект по bash
В файл не забудем поместить строчку: Е[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.