LINUX.ORG.RU

Подход к написанию скриптов (я один такой?)

 


1

3

Привет

По работе приходится писать bash скрипты. У тут дилемма: писать так, чтоб работало на целевых серверах, или чтобы работало везде; ведь теоретически мой скрипт могут переиспользовать. Плюс, есть уйма нестандартных ситуаций: что-то может глюкануть, что-то может измениться после апгрейда и т. п.; вероятность таких ситуаций - что-то около 0.01%, но ведь это возможно.

И это абсолютно разные задачи.

Недавно попался показательный пример. Есть bash скрипт, который, по сути своей, состоит из около 5 строк. Следуя принципу «чтобы работало везде» я его раздул до 350 (!). Там было всё: проверка наличия необходимых утилит в системе, логирование, проверка что файловая система не read-only, даже проверка на то, что у меня именно GNU sed. Всё сдобрено обильными комментариями, на случай поддержки другим человеком.

Всё работает. Но...

Вот теперь сижу и думаю: 5->350 это нормально? Я один такой?

Один товарищ глянув на это изрёк: «здоровая паранойя программиста». Я так и не понял, был ли это комплемент или нет.

Считаете ли вы такой подход правильным? Кто еще пишет скрипты «на все случаи жизни»?

★★★★★

Последнее исправление: Kroz (всего исправлений: 4)

Если скрипт пишется для частого использования на длительное время на большом количестве машин, то это вполне нормально, я считаю.

aquadon ★★★★★
()

Использовать systemd.

/thread

anonymous
()

а не проще ли использовать встроенные языки (perl, python и т п) ?

Jopich1
()
Ответ на: комментарий от d_a

Каноничные 5 строк

Паазвольте! Во-первых, а Fatal()? Во-вторых, на кой надо было local tool=$1 ?

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

Это ерунда по сравнению с тем, что оно что-то сделает и вывалится на половине, а потом вычищай то, что испохабилось наполовину.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Во-вторых, на кой надо было local tool=$1 ?

Для самодокументированности. Именованных параметров-то в функции не завезли. А строчек мне не жалко, у меня хороший текстовый редактор.

Это ерунда по сравнению с тем, что оно что-то сделает и вывалится на половине, а потом вычищай то, что испохабилось наполовину.

Надо ERR трапать, вот кстати осталось неизвестно сделал ли это ТС.

d_a ★★★★★
()
Последнее исправление: d_a (всего исправлений: 1)

Я один такой?

Нет, вполне естественное желание. Сам себя ловил на таких вещах неоднократно. Ну и примеры выше в обсуждении.

Считаете ли вы такой подход правильным?

Нет.

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

Нужно просто принять тот факт, что shell — очень плох в качестве языка программирования. Это скорее «синяя изолента», средство для склеивания ввода–вывода нескольких утилит, и должно применяться соответственно — для однострочников и мелкой автоматизации.

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

А то и вовсе посмотреть в сторону систем автоматизации сборки (make, CMake и подобные), или даже управления конфигурациями (Chef, Ansible, etc) — в зависимости от того, какая задача стоит.

Quote
()
Ответ на: комментарий от d_a

Надо ERR трапать,

Речь о том, что это полдела, ибо надо знать ВСЁ, что сделал скрипт до ошибки.

vodz ★★★★★
()

Зависит от назначения рукожопства:

Если «для себя» (для своей конторы, etc), то смысла нет.

Если «на продажу» (дарение, выкладку, etc), то всё проще решается:

в первых строках скрипта задаю утилитки с путями в виде переменных, а потом для работы использую из вызов через переменную, типа:

_____

#!/bin/bash

CAT_UTIL=«/bin/cat»

TEMP_FILE=«/tmp/tempfile»

$CAT_UTIL $TEMP_FILE

_____

Если уж будет ну НАСТОЛЬКО нестандартный дистр, то руками подправят пути.

slamd64 ★★★★★
()

Считаете ли вы такой подход правильным?

Зависит от того нужно ли это реально в проекте. Если реально нужно, то напишу. Если же скрипт будет использоваться пару недель, а потом будет выкинут, то это явно перебор.

Norgat ★★★★★
()

Следуя принципу «чтобы работало везде» я его раздул до 350 (!). Там было всё: проверка наличия необходимых утилит в системе,

Считаю, такой подход неправильным.

1. Если что-то пойдёт не так (а всё ты не учтёшь), то никто не будет разбираться с твоим монстром в 350 строк. Пусть будет 5-10 строк, но понятных и документированных. Тогда есть шанс, что твой скрипт легко модифицируют под конкретику.

2. ИМХО, 95% твоих проверок ни разу не выстрелят, т.е. ты отработал впустую.

3. У меня обычно имеет место обратный процесс, сначала скрипт на страницу, а затем он «усыхает» до нескольких строк. Но во всём должна быть мера - скрипт не должен допускать трюкачество и оставаться понятным.

oblfan
()

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

Pro100User
()

В общем, почитал я ответы и понял, что единого или даже превалирующего мнения нет. Любой ответ спровоцирует холивор.
Разве что я не один такой.
В любом случае всем спасибо.

Kroz ★★★★★
() автор топика
Последнее исправление: Kroz (всего исправлений: 2)

Комментарии, системные требования и справка

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

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

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

znavko ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.