Лучшие практики для создания сценария оболочки в GNU / Linux

Обычно, когда вы начинаете работать над Область администрирования серверов с операционными системами GNU / Linux и / или Unix, человек обнаруживает себя (лица), работая в среде, где обычно есть куча запланированных задач, написанных другими админами и что в какой-то момент мы должны управлять (управлять) для решить любую проблему, улучшить и / или устранить, чтобы соответствовать новым требованиям Учреждения где он работает. Так что неудивительно, что любое новое Сисадмин На любом рабочем месте вы сталкиваетесь с трудоемкой задачей понять некоторые из Сценарий оболочки создано другими старый сисадмин, которые плохо написаны или имеют логическую или письменную структуру, непростые для понимания или, в худшем случае, с командными командами, нетипичными, старыми, неэффективными или написанными в неудобной и запутанной форме.

Скрипты оболочки

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

Поэтому после практической серии публикаций по «Изучение сценариев оболочки» где мы исследуем некоторые очень практичные сценарии с простыми и базовыми командами, мы начнем с этой новой серии под названием «Лучшие методы создания сценария оболочки в GNU / Linux», где мы тщательно сосредоточимся на каждом маленьком аспекте и причине многих вещей, то есть мы рассмотрим несколько советов, которые помогут нам создавать лучшие сценарии, но не столько для себя, сколько для следующего человека (системного администратора), который должен управлять ими. Таким образом, вам не нужно выполнять утомительную и сложную задачу по выяснению того, что я кодирую, как и почему и почему это больше не работает.

В этом первый (1-й) пост этой новой серии «Лучшие практики для хорошего сценария оболочки для GNU / Linux» Мы поговорим о том, что идет или должно идти в Заголовок сценария оболочки.

=======================================
ЗАГОЛОВОК - ПРИЗЫВ ОБОЛОЧКИ
=======================================

#! / путь / интерпретация [параметр-аргумент]

Верхняя строка - это базовая структура, с которой вызывается сценарий оболочки для GNU / Linux. Его элементы можно описать следующим образом:

#! => ша-бах

Ша-бах (#!) Вверху созданного или создаваемого скрипта находится скрипт, который сообщает нашей операционной системе, что наш файл представляет собой набор команд, которые будут подаваться (интерпретироваться) интерпретатором команд, указанным после него. Пара символов #! на самом деле это магическое число двухбайтовый, специальный маркер, обозначить тип файла, а в нашем случае исполняемый сценарий оболочки. Сразу после ша-бана идет имя путь, по которому находится исполняемый интерпретатор, плюс имя указанного интерпретатора. Другими словами, это путь к программе, которая интерпретирует команды в сценарии, будь то интерпретатор, язык программирования или служебная программа. Затем эта оболочка выполняет команды сценария, начиная сверху (строка после sha-bang) и игнорируя любые комментарии. Несколько ша-бах Они включают в себя:

#! / Bin / ш
#! / Bin / Баш
#! / usr / bin / perl
#! / usr / bin / tcl
#! / bin / sed -f
#! / usr / awk -f

Каждая из строк, описанных выше (в качестве примера), вызывает другую оболочку. Линия / Бен / ш, вызвать оболочка по умолчанию (Bash в операционной системе GNU / Linux) или другое подобное. С помощью #! / Bin / ш, значение по умолчанию Борн Шелл В большинстве коммерческих вариантов операционных систем на основе UNIX он создает скрипт. переносится на другие операционные системы, которые не являются Linux должным образом, но похожий или основанный на нем или на UNIX, хотя это приносит в жертву определенные характеристики BASH. Однако последовательность "#! / Бин / ш" соответствует норме POSIX sh стандарт.

Обратите внимание, что путь, указанный в ша-банге, должен быть правильным, иначе сообщение об ошибке, обычно "Команда не найдена", это будет единственный результат выполнения скрипта. Помните пару символов »#! « его можно опустить, если сценарий состоит только из набора общих команд операционной системы, то есть без использования внутренних директив оболочки. И еще раз помните, что »#! / Бин / ш« вызывает интерпретатор оболочки по умолчанию, который по умолчанию »#! / Bin / bash« в команде с ним Операционная система GNU / Linux.

Что касается аргументов, можно использовать несколько, но наиболее распространенными являются: »-E«. что делает сценарий проверить ошибки выполнения любой командыo (строка исполнения) и если положительный, заставляет остановиться и выйти, типичный »-F« для указать, какой скрипт загружать и один из самых редких - »-Rm« который выполняет его удаление после завершения его выполнения. Можно только указать в ша-бах пока единственный аргумент (параметр) после названия программы, которую нужно выполнить.

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

Мой совет (Лучшие практики) выбрать лучший ша-бэнг и возглавляя Сценарий оболочки являются:

#! / usr / bin / env bash

Зачем использовать команду »Env« Мы указываем операционной системе, какой интерпретатор будет использоваться, с точным путем, указанным в нем по умолчанию, что позволяет нам иметь ша-бах что увеличивает его портативность, потому что не во всех ОС GNU / Linux интерпретаторы или программы имеют один и тот же путь. И без аргументов, потому что для этого лучше использовать команду наборпотому что с ним мы можем проверить ошибки, общие (-e) или конкретные (+ x / -x), О пункт очистить глобальные предустановки для переменных среды (-i) или определенных (-u / –unset). И наконец, чтобы выполнять определенные (- o) дополнительные действия внутри скрипта.

Итак, мой рекомендуемый ЗАГОЛОВОК будет:

#! / usr / bin / env bash
# Укажите интерпретатор bash с абсолютным путем в операционной системе.

установить -o errexit
# Чтобы указать скрипту остановиться и закрыть, когда команда или строка выполнения не работают.

set -o существительное
# Чтобы сказать скрипту останавливаться и закрываться, когда скрипт пытается использовать необъявленные переменные.

установить -o pipefail
# Чтобы получить статус выхода последнего заказа, который вернул ненулевой код выхода.

# установить -o xtrace
# Чтобы отслеживать, что работает. Полезно для отладки. Включите его только для проверки ошибок.

Не забудьте дополнительно следовать этим рекомендациям:

01.- Введите свой код: Очень важно сделать ваш код читабельным, и многие люди, кажется, тоже об этом забывают. Постарайтесь сделать необходимые углубления, чтобы увидеть хорошую логическую структуру.

02.- Добавьте пробелы между разделами кода: Это может помочь сделать код более понятным, поскольку интервалы между модулями или разделами помогают сделать код читаемым и легким для понимания.

03. - Прокомментируйте код как можно подробнее: Вверху (или внизу) каждого Порядка команд (Строка выполнения) или Раздела кода идеально добавлять описание функции последовательности (ей) команд, чтобы объяснить, что происходит внутри самого кода.

04.- Создавать переменные с описательными названиями их функций: Назначьте описательные имена переменных, которые явно идентифицируют функцию, для которой она будет создана. Даже если вы создаете временные переменные, которые никогда не будут использоваться за пределами одного блока кода, все же хорошо указать имя, которое неявно (объективно) объясняет, какие значения или функции он обрабатывает.

05.- Используйте синтаксис VARIABLE = $ (command) для подстановки команд: Если вы хотите создать переменную, значение которой получено из другой команды, есть два способа сделать это в bash. С участием кавычка, то есть с персонажами `` , EJM: VARIABLE = `command -options parameters`, но он уже устарел, поэтому синтаксис ПЕРЕМЕННАЯ = $ (команда) это самый современный, принятый и рекомендуемый способ. НЕТ -> ДАТА = `дата +% F` / ДА -> ДАТА = $ (дата +% F)

06.- Используйте модули и / или проверочные переменные суперпользователя и авторизованного пользователя с паролем или без него: При необходимости повысить уровень безопасности.

07.- Используйте модули и / или переменные валидации операционной системы (Distro, Version, Architecture): для предотвращения использования на неподходящих платформах.

08.- Используйте модули (процедуры / разделы) для подтверждения выполнения критических или пакетных действий (модулей / функций): Чтобы свести к минимуму ошибки из-за импровизации или невнимательности.

09. - Обеспечьте удобный интерфейс (удобный): Терминалом с меню и цветами с Диалог и Графические интерфейсы для базовых пользователей с Zenity, Gxmessage. И если возможно, используйте поддержку звуковых предупреждений, идентифицирующих распознаваемые события по звуку. Я старался изо всех сил, чтобы ваш скрипт мог работать в обоих направлениях, просто включая и отключая опции / модули / функции.

10.- Включите модули (сообщения) приветствия и прощания: в случае необходимости увеличить интерактивность с пользователем.

11.- Включите модуль проверки двойного выполнения: Создайте для него файл блокировки, чтобы он не выполнялся более одного раза одновременно.

12.- Рационализируйте размер скрипта с помощью внешних функций и / или модулей: Если сценарий очень большой, разделите код с помощью функций или разделите их на небольшие сценарии, которые запускаются через основной.

13.- Вызов ясным и очевидным образом вызовов другим интерпретаторам (языкам программирования) в скрипте: Вызывает их четко по строкам или модулям.

пример:

# ================================================== #
#!/bin/bash
#Llamando a un interprete externo a BASH
echo 'El siguiente texto será mostrado por el interprete de PERL'
perl -e 'print "Este texto es mostrado por un script PERL embebido.\n";'
exit 0
# ==================================================#
# ==================================================# 
#!/bin/bash #Llamando al interprete de Python. 
echo 'El siguiente es un script de python:'
echo print "Hola, mundo!" | tee $HOME/.testpythonbash.py
python $HOME/.testpythonbash.py exit 0
# ==================================================#

# ======================================================= #
#!/bin/bash
# bash-y-perl.sh

echo "Saludos desde la parte BASH del script."
# Es posible añadir mas comandos BASH aqui.

exit 0
# Fin de la parte BASH del script.

###########################################################

#!/usr/bin/perl
# Esta parte del script se invoca con la opcion -x.

print "Saludos desde la parte PERL del script.\n";
# Podemos añadir mas comandos PERL aqui.

# Fin de la parte PERL del script.
# ======================================================= #
 

В будущих публикациях мы более подробно раскроем каждую из описанных выше практик.

И если вы знаете некоторые другие передовые практики, свои или чужие, не стесняйтесь комментировать их, чтобы составить более полный сборник!

До следующей публикации этой новой серии.


6 комментариев, оставьте свой

Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

  1.   Макс х родригес сказал

    Всего одна деталь, это «шебанг» 😛
    очень хороший пост, хорошие практики в долгосрочной перспективе всегда помогают стандартизировать.

  2.   Тот, что прошел здесь сказал

    Bash не является оболочкой по умолчанию во всех дистрибутивах, поэтому символическая ссылка / bin / sh не всегда указывает на bash. Например, в Debian (и поэтому я предполагаю, что Ubuntu):
    $ ls -l / bin / sh
    lrwxrwxrwx 1 корень корень 4 aza 8 2014 / bin / sh -> dash
    Следовательно, оболочкой по умолчанию в Debian является тире. Глянь сюда: https://wiki.debian.org/Shell

  3.   безымянный сказал

    В качестве совета по использованию оболочки:

    эхо $ 0
    echo $ SHELL
    окружение | ОБОЛОЧКА

  4.   Инженер Хосе Альберт сказал

    Вы действительно правы! Я тестировал DEBIAN 9 и Kali Linux 2.0, и это правда! заставляет вас броситься. Тем более что рекомендация: #! / Usr / bin / env bash, если это оболочка, которую вы хотите использовать.

    И вы абсолютно правы, это шебанг, но на некоторых сайтах (в технической литературе) это называется шабанг или другими словами, отсюда и мое замешательство. Пример:

    В вычислениях shebang - это последовательность символов, состоящая из знака числа символов и восклицательного знака (#!) В начале скрипта. Это также называется sha-bang, [1] [2] hashbang, [3] [4] pound-bang, [5] или hash-pling.

    С: https://en.wikipedia.org/wiki/Shebang_%28Unix%29

    Y Глава 2. Начнем с ша-бана
    С: http://www.tldp.org/LDP/abs/html/sha-bang.html

  5.   Инженер Хосе Альберт сказал

    Также: basename $ 0