LINUX.ORG.RU
ФорумTalks

Какой самый сложный bash скрипт Вы создавали?

 , ,


0

2

Иногда я ловлю себя на том, что пишу 100-строчные

bash-скрипты для вещей, которые, вероятно,

можно сделать в 5 строк с помощью

другого инструмента… но где же веселье в этом?

Интересно, какие нелепые, но функциональные bash-скрипты вы

создали, которые заставили вас сказать: «все в порядке».

Перемещено CrX из development



Последнее исправление: antonio-an (всего исправлений: 1)

Есть несколько по 350–400 строк. Больше вроде не доводилось (хотя мог и запамятовать).

Во всех случаях таких больших скриптов на другом языке это же было бы сделать проще. Но нужна была совместимость, чтобы запускалось буквально везде. Ну и если точнее, они не совсем bash-скрипты, а POSIX shell совместимые — без башизмов. Под тем же busybox тоже работают.

P.S. Это вместе с пустыми строками (между функциями например) и комментариями количество строк. Хотя в шелл-скриптах у меня комментарии весьма редки.

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

Бэкапилку писал когда-то давно для сервака, на котором хостился hip-hop.ru и пачка оффсайтов каких-то русских рэперов. Несколько сотен строк на баше.

leave ★★★★★
()

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

Сам, если скрипт на bash начинает превышать размер в 30-40 строк, переписываю его на python.

В последнее время, пишу скрипты на fish. Да, это не POSIX, но 100% скриптов я пишу для себя самого, мне не важна переносимость и совместимость со стандартами 60-летней давности.

За 60 лет куча вещей устарела и стала банально неудобной. bash - в их числе, несмотря на то, что какое-то вялое развитие в нём продолжается.

На LOR преобладают староверы, которым кажется, что обязательно тащить всё 60-летнее наследние, хотя пользуются они, например, современными LCD мониторами, и не одним, а не древними телетайпами. Когда-то я был таким же пуристом, но потом понял, что лучше я возьму что-то сделанное для 21-го века, нежели буду тратить время и нервы на программу из 70-х годов прошлого века.

Есть, конечно, вещи, которые за 60 лет не состарились. Но их не так уж много.

Chiffchaff
()

+1 за фиш, намного приятнее писать скрипты без баш шизы

masa ★★★
()

Пожалуй, скрипт отображения текущих параметров видеокарт, контроля их частот, вентиляторов и т.п. для майнинг-ригов.

YAR ★★★★★
()

Да это всё сказочки. Расскажи, на каком языке кратко, не притягивая внешние библиотеки, можно написать что-то подобное (это не bash, чистый shell):

#!/bin/sh

new_messages_help() {
    echo "Use: `basename $0` <MSG_QUAN>"
    exit 0
}

[ "$1" ] || new_messages_help


new_messages_play="mpv --really-quiet"
NEW_MESSAGES_SND_DIR="/usr/local/extra/share/sounds"
NEW_MESSAGES_QUAN="${1}"
NEW_MESSAGES_QUAN_LEN="${#NEW_MESSAGES_QUAN}"
#NEW_MESSAGES_TADAM="${NEW_MESSAGES_SND_DIR}/tadam.mp3"
NEW_MESSAGES_MAIL="${NEW_MESSAGES_SND_DIR}/mail.mp3"

NEW_MESSAGES_QUAN_LS="`printf "${NEW_MESSAGES_QUAN}" | rev | cut -c1`"
NEW_MESSAGES_QUAN_MS="`printf "${NEW_MESSAGES_QUAN}" | rev | cut -c2`"
NEW_MESSAGES_QUAN_FS="`printf "${NEW_MESSAGES_QUAN}" | rev | cut -c3`"

if [ "$NEW_MESSAGES_QUAN_LEN" -ge "4" ] ; then
    NEW_MESSAGES_PLAY_FILES="${NEW_MESSAGES_SND_DIR}/more.mp3 ${NEW_MESSAGES_SND_DIR}/1000s.mp3"
fi

if [ "$NEW_MESSAGES_QUAN_LEN" -le "2" ] ; then
    if [ "$NEW_MESSAGES_QUAN" -le "20" ] ; then
        NEW_MESSAGES_PLAY_FILES="${NEW_MESSAGES_SND_DIR}/${NEW_MESSAGES_QUAN}.mp3"
    else
        NEW_MESSAGES_PLAY_FILES="${NEW_MESSAGES_SND_DIR}/${NEW_MESSAGES_QUAN_MS}0.mp3"
        if [ "$NEW_MESSAGES_QUAN_LS" -ne "0" ] ; then
            NEW_MESSAGES_PLAY_FILES="${NEW_MESSAGES_PLAY_FILES} \
            ${NEW_MESSAGES_SND_DIR}/${NEW_MESSAGES_QUAN_LS}.mp3"
        fi
    fi
elif [ "$NEW_MESSAGES_QUAN_LEN" -eq "3" ] ; then
    NEW_MESSAGES_PLAY_FILES="${NEW_MESSAGES_SND_DIR}/${NEW_MESSAGES_QUAN_FS}00.mp3 \
    ${NEW_MESSAGES_SND_DIR}/${NEW_MESSAGES_QUAN_MS}0.mp3"
    if [ "$NEW_MESSAGES_QUAN_LS" -ne "0" ] ; then
        NEW_MESSAGES_PLAY_FILES="${NEW_MESSAGES_PLAY_FILES} \
        ${NEW_MESSAGES_SND_DIR}/${NEW_MESSAGES_QUAN_LS}.mp3"
    fi
fi

if [ "$NEW_MESSAGES_QUAN_LS" -eq "1" ] ; then
    NEW_MESSAGES_PLAY_END="${NEW_MESSAGES_SND_DIR}/messages1.mp3"
elif [ "$NEW_MESSAGES_QUAN_LS" -ge "2" -a "$NEW_MESSAGES_QUAN_LS" -le "4" ] ; then
    NEW_MESSAGES_PLAY_END="${NEW_MESSAGES_SND_DIR}/messages3.mp3"
else
    NEW_MESSAGES_PLAY_END="${NEW_MESSAGES_SND_DIR}/messages2.mp3"
fi

${new_messages_play} \
${NEW_MESSAGES_TADAM} \
${NEW_MESSAGES_MAIL} \
${NEW_MESSAGES_PLAY_FILES} \
${NEW_MESSAGES_PLAY_END}

// Озвучка количества новых сообщений для Silpheed.

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

В далеком 2008 году у меня была своя баннерообменная сеть для сайтов с суммарной аудиторией более 2млн хитов (очень много для того времени для одного вебмастера). Она была написана на bash (на коленке, по-быстрому, собственно, поэтому на bash’е). Жрала кучу ресурсов, и в какой-то момент мне из руцетра написали, что не мог бы ты, дружище, оптимизировать свои скрипты, а то мы тебе по доброте душевной оперативы в vps нахаляву подкинули, сверх тарифа, но ты все равно ее полностью сжираешь. Я переписал на перле. Нагрузка на проц и потребление ресурсов упала раз в 100. Еще год с мелочью она крутилась, а потом я закрыл этот проект и занялся другими вещами.

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

После 50 строк – перехожу на питон.

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

Но нужна была совместимость, чтобы запускалось буквально везде

Тоже так думал, но из-за GNU/BSD тёрок пришлось перейти на пистон. А после 100 строк дебаг превращается в такой ад, что пистон лучше и без учета совместимости

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

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

seiken ★★★★★
()

я тоже писал баш скрипты для перенастройки системы под себя после ее переустановки. сейчас 1. народ пишет скрипты на python. 2. скрипты хорошо пишет ИИ. попробуйте.

jura12 ★★★
()

Бэкапилку какую-то писал, довольно остроумную, но не очень большую.

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

Ну вот мои скрипты, например, требуют наличия докера…

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

Елси скрипт недостаточно велик для переписывания на питоне - всегда пишу башизмы + #!/bin/bash в заголовке.

Объявлять bash как зависимость даёт более предусказуемый результат, чем пытаться пистаь подо всё а тетсировать на 1-2х - потому что в итоге выясняется что оно всё равно на том на чем не тетсировали не работает

Если внезапнейше потребуется выполнить на системе где нет bash - то как и с любой зависимостью - придётся его туда ставить

GPFault ★★★
()
Последнее исправление: GPFault (всего исправлений: 1)
Ответ на: комментарий от IPR

Так это короткий скрипт, просто названия переменных такие длинные что и скрипт кажется громоздким.

firkax ★★★★★
()

Иногда я ловлю себя на том, что пишу 100-строчные
bash-скрипты для вещей, которые, вероятно,
можно сделать в 5 строк с помощью
другого инструмента… но где же веселье в этом?

«Веселья» нет и есть. Вы привязались к инструменту в виде «я знаю молоток и больше ничего».

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

Бэкапилку писал когда-то давно для сервака, на котором хостился hip-hop.ru и пачка оффсайтов каких-то русских рэперов. Несколько сотен строк на баше.

Было в духе:
rm -rf
Ё брат!
rm -rf
Мы будем делать rm -rf Брат!
? :)

anc ★★★★★
()

На баше большие портянки не писал, т.к. быстро свалил с него как интерактивного шелла на fish, а потом с него уже на zsh.

Хотя большая часть скриптов всё равно смотрит на /bin/sh, конечно.

А самые длинные скрипты у меня - ветвистое dmenu для запуска часто используемого софта.

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

У меня 1400 строк есть :-)

Тоже ради переносимости, настройка одной хитрой хрени на CentOS с 6 по 9 версии, с автоматическим выбором вариантов по ситуации и проверкой корректности дистрибутива – чтобы останавливалась на Debian с Ubuntu и прочих несовместимых.

Vsevolod-linuxoid ★★★★★
()

Это всё написано на шелле: Acme/Sam? (комментарий)

Стараюсь писать максимально просто, осознанно нарушая нормы нормальных ЯП. Получается в пределах 100-200 строк. То, что выживет, когда-нибудь перепишу на Go.

kaldeon
()

Бэкапилку: папочно (find -type f) мультипоточная (GNU parallel), ssh мультиплексинг, автопереподключение, конфигурируемая, полный отлов ошибок.

ac130kz ★★★
()

Лет 15-17 назад меня вштырил баш и я написал подкаст-аггрегатор на нём.

ЗЫЖ Да-да. Парсил XML grep’ом.

skiminok1986 ★★★★★
()

Я открыл учебник по bash… и писать скрипты желание отпало полностью. Слишком архаичный язык.

Всё равно что писать стихи на старославянском. Прикольно, но абсолютно бесполезно.

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

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

Только bash, ибо стандарт.

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

Какой самый сложный bash скрипт Вы создавали?

Я в принципе не пишу на Bash, потому что у меня его нет.
Но нередко пишу всякую автоматизацию на POSIX Shell.

нелепые, но функциональные

Было бы странно писать бесполезное.


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

  • 670
  • 720
  • 760
  • 950
  • 1270 // Вот этот планируется переписать на чём-нибудь другом, потому что писать парсинг конфигов (собственный формат) на shочень больно. (=

Бо́льшая часть — проверки и условия для совместимости. Они работают на свежеустановленной FreeBSD без установки дополнительных пакетов, на Linux требуется coreutils, busybox и ещё что-то, наверное, но в Debian всё нужное обычно искаропки.

mord0d ★★★★★
()

Утерянный навык, 20 лет назад bash-скрипты писал гораздо лучше, чем сейчас.

dmitry237 ★★★★★
()
pinkbyte@oas1 ~/dev/utm5-scripts/autogen $ find ./ -name *.sh -exec cat {} \; | wc -l
1087

Система генерации конфигов для ISC DHCP на базе данных биллинга NetUP UTM5. Всё никак не дойдут руки переписать на Python - код работы с IP-подсетями на баше - та еще наркомания в плане удобства (по сравнению с библиотекой ipaddress)

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

у меня была своя баннерообменная сеть для сайтов

А как ты ее монетизировал? Ради чего она была сделана?

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

А кто сказал, что там что-то собирается? Целевой код на питоне. Хотя есть, есть там компонент на сишке. Но он тоже собирается в докере. Но запихивать всё это в мейкфайлы - это задача для чемпионата по кривому дизайну в программировании.

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

POSIX shell совместимые

Как ты это определяешь?

Под тем же busybox тоже работают

Это ничего не значит.

Все эти POSIX shell это одна большая шляпа. Максимум к этому можно стремиться. Нет какого-то эталонного posix shell, после запуска на котором можно было бы сказать, что скрипт запустится везде.

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

Слишком архаичный язык.

Это верно.

Прикольно, но абсолютно бесполезно.

Как раз *sh это весьма полезно, поскольку стандарт де-факто. Ты со скриптами столкнёшься везде, в любом линуксе половина выполняемых файлов это *sh скрипты.

vbr ★★★★★
()

Я в скрипты запускалки виртуалок для своих хотелок оборачиваю, чтобы гуй virt-manager’a не запускать. Тем более, что там полнейшая тривиальщина, вроде пути до образа диска и количества оперативки.

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

Как раз *sh это весьма полезно, поскольку стандарт де-факто.

sh - да. А вот даже по этому треду видно, что кто во что горазд: bash, csh, fish, zsh… Кароч, в баню

Ты со скриптами столкнёшься везде, в любом линуксе половина выполняемых файлов это *sh скрипты.

Столкнулся. Но не было ни единого случая, чтобы понадобилось что-то в этих портянках править/писать/искать

tiinn ★★★★★
()
Последнее исправление: tiinn (всего исправлений: 1)
Ответ на: комментарий от vbr

Как ты это определяешь?

При помощи знания и стандарта POSIX и «башизмов». То, что описано в POSIX — использую. То, что нет (но есть в bash, например) — не использую. А как ещё?

Ну ещё shellcheck есть, да. Впрочем, он больше для успокоения и отлова каких-то «помутнений», на деле он почти никогда ничего не находит.

Это ничего не значит.

Откуда ты знаешь, что это для меня значит или не значит? Значит. Значит эти скрипты будут работать там, где мне важно (а мне важно именно bash и busybox, такова специфика). То есть, это значит, что скрипты соответствуют задаче. Под dash и оригинальный bourne shell — мне менее важно, но под dash тоже работают, да.

Если ты имеешь в виду «работает под busybox — не значит, что точно следует POSIX shell», то это так. Так я и не утверждал обратного. Только то, что эти скрипты написаны под POSIX shell — то есть в них используется то, что описано в POSIX и не используется то, чего там нет, но добавлено в bash/zsh/прочих. Про busybox — это уже следующее предложение, связанное с предыдущим лишь косвенно. Если бы я имел в виду, «работают под busybox, значит POSIX-совместимые» (как ты, предположительно, подумал), то я бы там поставил тире, а не точку, и скорее всего ещё и без «тоже». А так контекст ведь был в том, что это не конкретно bash-скрипты, как в заголовке темы, а shell-скрипты в общее общем смысле. Они такие же busybox-скрипты, как и bash-скрипты :)

Нет какого-то эталонного posix shell, после запуска на котором можно было бы сказать, что скрипт запустится везде.

Да, это так.

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

Мне кажется такой пуризм излишним, если конечно не пишешь кроссплатформу ещё и под *BSD, AIX с Solaris – bash по умолчанию на всех Linux есть.

Vsevolod-linuxoid ★★★★★
()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 1)
Ответ на: комментарий от CrX

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

Обычно используются RHEL-based, Debian-based, SUSE…

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

Ну а мне надо, чтобы конкретно те скрипты работали везде (ну точнее на всех линуксах, совместимость с другими unix-like там целью не ставится). В том числе на достаточно редких дистрибутивах — это их суть. Там вообще обвес для squashfs, внутри которого всё вплоть до glibc для запуска в том числе и на дистрибутивах, использующих musl, а единственным требованием является шелл для запускал и либо поддержка SquashFS ядром, либо наличие в системе FUSE (к использованию которого откатывается в случае отсутствия поддержки в ядре).

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

При помощи знания и стандарта POSIX и «башизмов». То, что описано в POSIX — использую. То, что нет (но есть в bash, например) — не использую. А как ещё?

Ну вот я не так уж редко сталкиваюсь с тем, что в POSIX всё не так очевидно. Вот недавно - все пишут cp -r. А такого флага в POSIX нет, надо писать cp -R. То бишь это надо прям каждую утилиту с каждым флагом перепроверять по доке посикса. А они ещё и разных версий бывают. Ну может ты так и делаешь, но у меня короче уверенности нет, что мои скрипты в этом плане идеальны.

shellcheck кстати молчит на такое.

vbr ★★★★★
()

Что за очередной изврат с форматированием?
Всякий тупняк видел, и запятые где не надо, и пробелы перед знаками препинания…
Но разбиение предложений абзацами что-то новое.
Зачем?

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

Именно на баше - не помню, а вообще 200 - 300.

sparkie ★★★★★
()

но где же веселье в этом?

А что в твоем понятии веселье? Когда баш-скрипт удаляет все твои файлы только из-за того что тулза xyz с новой версии теперь добавляет \n в конце вывода?

Gary ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)