Альтернативы написанию скриптов на Bash

Вопрос или проблема

Я только что мигрировал на рабочую станцию UNIX. Моя память о Bash-скриптах исчезла с тех пор, как я учился в школе, и я нахожу синтаксис очень запутанным. Мне интересно, какие другие языки сценариев используются для автоматизации задач. Два самых популярных языка, о которых я слышал, это Perl и Python.

  1. Какой язык сценариев чаще всего используется в реальных компаниях?
  2. Какой язык сценариев наиболее близок к синтаксису C/C++?
  3. Существует ли другой язык сценариев, о котором я не знаю?

В какой-то степени это вопрос личных предпочтений. Perl и Python, безусловно, находятся на вершине популярности.

Тем не менее, чтобы ответить на два из ваших трех вопросов:

  1. Я бы предположил, что bash используется наиболее широко, вероятно, за ним следует perl. Просто догадываюсь, не знаю, проводил ли кто-либо опрос. 🙂
  2. Существует множество языков сценариев. 🙂

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

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

  1. Bash – определенно самый легкий для изучения. В Bash-скриптах вы запускаете команды и манипулируете выводом.
  2. Python – второй по легкости для изучения. Python гораздо более полезен, чем Bash, поскольку вы можете использовать Python для написания полных программ, и он хорошо поддерживается сообществом. Python также чрезвычайно читаем и легок для редактирования даже через месяцы.
  3. Perl – лучший из трех (для скриптов), но с самым крутым порогом обучения. Имеет очень хорошую поддержку регулярных выражений (что является основной причиной его актуальности и сегодня), и вы, вероятно, столкнетесь с множеством Perl-скриптов со временем. Основные проблемы с Perl заключаются в читаемости кода – через несколько месяцев после написания кода вы не сможете понять, что он делает. Поэтому лучше прокомментировать код.
  4. Awk/Sed – оба очень полезны, но оба очень трудно изучить. Я бы посоветовал заниматься ими последними, если вы не разбираетесь в шаблонах.

Что касается того, какой из них учить прямо сейчас (поскольку вы, вероятно, не знаете ни одного из них), я бы изучил Python. Это самый простой и полезный язык для изучения.

И каковы ответы на ваши вопросы:

Какой язык сценариев чаще всего используется в реальных компаниях?

Все из них, но я бы предположил, что Perl имеет некое преимущество здесь (так как он используется в системном администрировании гораздо дольше).

Какой язык сценариев наиболее близок к синтаксису C/C++?

Perl

Существует ли другой язык сценариев, о котором я не знаю?

Ruby, Tcsh/Csh, http://en.wikipedia.org/wiki/Interpreted_language

awk для мелких задач, python для более сложных.

Python (если вы не используете специфические API и другие зависящие от платформы вещи) имеет богатую “стандартную библиотеку”, которая доступна на всех платформах, где вы получаете используемую версию python. Это очень удобно, так как вы можете легко переиспользовать свои скрипты, и ваши знания будут хорошей инвестицией, даже если вы измените свою платформу.

В нашей компании мы используем python для всех сценариев, мониторинга и … java для приложений, и нам хорошо в гетерогенной среде.

Sh (bourne shell), grep, awk и sed – это всегда хорошие вещи, с которыми стоит снова разобраться. Perl великолепен, если вы хотите много текстовой обработки regex и поддерживаемость не так важна (не говорю, что это невозможно). Python; если для вас важна читаемость. Мой выбор – Python, но все эти инструменты хороши для большинства задач, которые вы им ставите. Возможно, вам стоит пересмотреть свои требования к синтаксису c/c++, застревать на нем не поможет вам в долгосрочной перспективе.

  • Ruby
  • Python
  • Go – кроссплатформенный язык, в котором сценарии упоминаются как одна из сильных сторон Go.
  • Node.js – см. Grunt.js, Gulp.js. Многие проекты сейчас используют Node.js как инструмент автоматизации оболочки.
  • Perl

Чтобы добавить еще один интересный вариант в список, посмотрите Closh

https://github.com/dundalek/closh

Это замена bash, которая запускает полный Clojure(Script). Вы можете использовать все лаконичные и мощные инструменты Clojure на командной строке. Это все еще молодой проект, но довольно интересная и привлекательная альтернатива… недоброжелательному синтаксису bash.

Я бы сказал, что perl и python, вероятно, являются двумя лучшими альтернативами. Вы также можете сделать многое с sed и awk.

Если вы хотите изучить что-то с нуля, вероятно, лучше всего (пере)изучить bash.

Кроме того, perl и python сейчас популярны; мне больше нравится perl, но мой стиль программирования на perl не изменился сильно с тех пор, как вышел Perl 4.

Я не знаю о каких-либо языках сценариев, похожих на “c-синтаксис”.

Perl, безусловно, если только ради потрясающего ресурса CPAN (http://search.cpan.org/). Преимущество использования языка сценариев с такой огромной сообщающейся общиной заключается в том, что вам вряд ли когда-либо придется изобретать что-то самостоятельно.

Perl также имеет преимущество быть настолько сложным, насколько вы хотите для текущей ситуации. Вы можете рассматривать его как простой язык сценариев для быстрой администрирования или сценариев единственного назначения, но можете использовать объектно-ориентированные концепции или обширные мета-объектные системы, когда захотите создать более крупные, простые в обслуживании приложения (например, демоны, серверы, клиенты).

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

Синтаксис Perl также может быть удивительно близким к C, если вы сможете обойти отсутствие типизации и сигилов; продвинутое использование perl станет естественным, когда вы в конечном итоге узнаете сильные стороны языка.

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

p.s. Этот пост был заполнен ссылками на различные модули, удобные для администрирования, на CPAN, но, похоже, новые пользователи могут разместить только одну ссылку, поэтому используйте ту с CPAN, чтобы искать такие вещи, как ‘CVS’, ‘SVN’, ‘Cron’ и ‘Moose’ (обширная объектная система)

  1. наиболее используемый: Perl, в основном по историческим причинам. Python широко доступен во всех дистрибутивах Linux и BSD (он даже установлен на Mac OSX) и гораздо приятнее для изучения/программирования. Конечно, как только вы освоите синтаксис, Bash проще для почти всего, что вы можете сделать в командной строке. В конце концов, это и есть командная строка.

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

    • другие языки сценариев: много! Lua, Ruby, JavaScript…

Вы должны использовать комбинацию всех этих языков там, где это уместно. Мне действительно не нравится perl (читаемость), но он хорош для многих вещей. Python, с другой стороны, был чем-то новым для меня в области системного администрирования, пока мне не пришлось управлять (и мне все еще нужно) несколькими KVM машинами. Запуск, остановка, сохранение, загрузка, миграция всех этих машин через скрипт стали реальностью после 1 часа мороки с python-обертками libvirt.

В конце концов, я бы не использовал perl или python, если мне нужно, скажем, выгружать все базы данных с mysql-сервера каждую ночь (каждая база данных в своем собственном файле дампа), упаковывать их и синхронизировать с другим сервером. Почему? Потому что это быстрее и проще написать на bash 🙂

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

[по общим советам по сценариям смотрите другие ответы]

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

Для выполнения цепочек программ CLI и, возможно, многих цепочек последовательно, bash проще всего. Perl может сделать то же самое, но язык гораздо труднее изучить и гораздо сложнее, и, как многие уже отметили, легко написать непонятный Perl.

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

Примеры того, что я имею в виду:

$ cat input.dat | numerical_model source_data ${SRC} grid_size ${GRID_SIZE} param1 ${P1} param2 ${P2} | tee ${OUTPUT} | plotter title ${TITLE} ylabel ${YLABEL} xlabel ${XLABEL} > ${OUTPUT_FIG}
$ cat ${OUTPUT} | stats_cmd bin_size ${BINSIZE} dist_type ${DIST_TYPE} | tee ${OUTPUT_STATS} | plotter plot_type ${PLOT_TYPE} title ${TITLE_STATS} > ${OUTPUT_FIG_STATS}

В bash просто обернуть это в несколько циклов по некоторым из этих параметров. Тем не менее, код становится трудным для чтения, когда скрипт содержит более нескольких десятков строк. — представьте 30 наборов команд (по несколько строк каждая) для тридцати различных графиков данных —

Perl и Python могут быть лучше для крупных скриптов, потому что у них более чистый синтаксис для циклов и переменных, но команды bash должны быть сгенерированы как строки, запущены как подпроцессы, и захвачены stdin, stdout. Это можно сделать, но это не может полностью заменить родную среду оболочки.

Если бы оболочки имели лучший язык, это все было бы избегнуто.

Мне нравится ruby. Он простой и с ним легко программировать. Есть отличная книга о системном администрировании с использованием ruby.

Ruby используется в нескольких системах управления конфигурацией (capistrano, chef, puppet) и в последней версии metasploit.

Вы можете использовать rush, замену для Unix-оболочки с синтаксисом ruby и делать такие вещи:

local = Rush::Box.new('localhost') 
remote = Rush::Box.new('my.remote.server.com')     
local_dir = local['/Users/adam/myproj/']
remote_dir = remote['/home/myproj/app/']

local_dir.copy_to remote_dir
remote_dir['**/.svn/'].each { |d| d.destroy }

Пример однострочников на ruby:

> echo 'Shell is the best!' | ruby -pe 'gsub("Shell", "Ruby")' 

Ruby is the best!

> printf "foo\nbar\nbaz\n" |  ruby -ne 'BEGIN { i = 1 }; puts "#{i} #{$_}"; i += 1'

1 foo
2 bar
3 baz

Я бы использовал ruby.

По сравнению с sh, он современен и мощен.

По сравнению с python, он последовательный, одна версия, один менеджер пакетов. И мне не нравится синтаксис с отступами.

По сравнению с Perl, он немного старомоден, и синтаксис слишком сложен для меня.

Чтобы предложить еще один язык, я бы очень рекомендовал Raku. Raku (изначально Perl 6) должен был стать следующей версией языка Perl, но в итоге был отделен из-за масштабных редизайнов, предназначенных для его модернизации.

Несколько изменений:

  • Он использует . вместо ->
  • В языке удалены некоторые странные форматы разделителей пробелов
  • Несколько улучшений реализации, чтобы сделать язык более разумным

https://raku.org

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

Важно, чтобы все члены команды договорились о языке программирования, который будет использоваться. Язык, близкий к разработке проекта, часто является подходящим выбором. Другим жизнеспособным вариантом является язык, широко известный в отрасли, такой как язык, используемый в образовании. Python является ярким примером в этой категории. Он предлагает универсальность, от простых однострочников до комплексных приложений, имеет значительное сообщество, обширные библиотеки и подходит для манипуляции данными. Кроме того, его обучают в учебных заведениях. По сути, Python напоминает современный Perl.

Другими потенциальными выборами являются JavaScript, который более удобен для пользователя с более узким набором инструментов, таким как Bun и Deno 2.

Ruby изначально использовался в системном администрировании и инструментах хакерства, но с тех пор уступил свою популярность Python.

Менее частые примеры включают Lisp, например, Babashka, нативный, быстро запускающийся интерпретатор Clojure, предназначенный для сценариев.

Хотя скомпилированные языки приемлемы, они не являются моим первым предпочтением. Однако, если время запуска приемлемо, их можно рассмотреть. Тем не менее, язык должен поддерживать запуск из shebang и включать другие функции оболочки POSIX, включая комментарии в стиле хешей и возврат кодов статуса. Go предлагает дополнительные инструменты, такие как gorun для решения проблемы shebang, но тем не менее, он все равно сталкивается с проблемами совместимости с оболочкой в других местах.

Баш-хаки, даже признанные в сообществе разработчиков POSIX, предполагают встраивание файлов в bash-скрипты, которые могут извлекать, компилировать и выполнять небольшие инструменты командной строки. На мой взгляд, этот подход представляет собой потенциальные риски безопасности, особенно в контексте заражения вредоносным ПО.

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

В заключение

  • Использование Bash больше не обязательно.
  • Широко известный язык – отличный выбор.
  • Языки, аналогичные тем, что используются в основном проекте, являются подходящими выборами.
  • Использование скомпилированных языков не всегда рекомендуется.
  • Избегайте некоторых хаки, особенно тех, которые влияют на неправильное использование кода и функций.
  • Менее известные варианты следует рассматривать только тогда, когда они имеют смысл.
  • Универсальность Python делает его подходящим выбором.
  • Декларативные языки набирают популярность в управлении конфигурацией, но они также могут быть частью более широкого набора инструментов.
  • Nix – относительно новый конкурент в этой области.

Ответ или решение

Альтернативы сценариев Bash: Введение в другие языки программирования

При миграции на UNIX-рабочую станцию, многие пользователи сталкиваются с проблемой автоматизации задач, которая традиционно решалась с помощью Bash-скриптов. Однако из-за сложности синтаксиса Bash, многие ищут более понятные и удобные средства для написания сценариев. Рассмотрим альтернативные языки программирования, которые могут стать удачной заменой Bash.

1. Популярные скриптовые языки

Самыми распространёнными языками, используемыми для автоматизации задач, являются Perl и Python. Оба языка имеют свои уникальные особенности, которые могут стать решающими факторами при выборе.

  • Python: Python стал одним из самых популярных языков для сценариев благодаря своей простоте и читаемости. Синтаксис языка интуитивно понятен, что позволяет быстро начинать работу даже новичкам. Огромная библиотека стандартных модулей и активное сообщество делают Python отличным выбором для системного администрирования и автоматизации задач.

  • Perl: Хотя Perl менее популярен, чем Python сегодня, он по-прежнему используется для сценариев, требующих сложной работы с текстом благодаря своей мощной поддержке регулярных выражений. Однако его синтаксис может быть сложным для восприятия, что приводит к проблемам с читаемостью кода.

2. Сравнение по популярности и синтаксису

  • Наиболее используемый язык в реальных условиях: Bash по-прежнему занимает лидирующие позиции из-за своей интеграции в UNIX-системы. Однако Perl исторически использовался в системном администрировании, а Python активно завоёвывает эту нишу из-за своей простоты и функциональности.

  • Синтаксис, похожий на C/C++: Perl и Ruby можно считать наиболее близкими по синтаксису к C/C++. Perl более «продвинутый», но многие пользователи находят Ruby более удобным и современным для написания сценариев.

3. Другие сценарные языки

Существует большое количество языков, которые могут также быть полезны для написания сценариев:

  • Ruby: Язык, который имеет сильное выражение и отличную поддержку в системном администрировании, особенно с такими инструментами, как Chef и Puppet.

  • JavaScript/Node.js: Новая эпоха использования JavaScript как языка сценариев для автоматизации благодаря таким инструментам, как Gulp и Grunt. Эта платформа обеспечивает поддержку асинхронного программирования, что может быть полезно для выполнения задач в фоновом режиме.

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

  • AWK/Sed: Идеальны для выполнения небольших задач. Хотя они могут быть трудны для изучения, они остаются мощными инструментами для текстовой обработки.

  • Lua: Легковесный язык, часто используемый в игровых приложениях и встроенных системах, который также может быть эффективно использован для создания сценариев.

Заключение

При выборе языка для написания сценариев важно учитывать не только распространённость, но и удобство, читаемость кода и особенности конкретных задач. Python является универсальным и популярным выбором, в то время как Perl предлагает возможности для работы с текстом. Ruby и JavaScript/Node.js могут предложить различные подходы к автоматизации. В конечном счёте, каждый язык имеет свои преимущества и недостатки, и правильный выбор зависит от ваших уникальных предпочтений и требований конкретных задач.

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

Оцените материал
Добавить комментарий

Капча загружается...