Скриптовые альтернативы сценариям оболочки Bash

16

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

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

Спасибо за вашу помощь,

Скотт

Скотт Дэвис
источник
2
Вероятно, это должно быть сообщество вики.
EBGreen
2
Я сейчас использую PHP для большинства системных задач. Я соберу правильный ответ с этим в ближайшее время. Он имеет много встроенных библиотек, что удобно.
Кайл Ходжсон
Предназначенные для оболочки языки делают то, чего не могли бы другие языки; То есть управлять и держать под контролем все дочерние процессы, когда-либо порожденные. В блоге, рекламирующем Phusion Passenger, подробно объясняется, почему: phusion.github.io/baseimage-docker Короче говоря, ваши сценарии, написанные на lang-x, вероятно, неправильно обрабатывают процедуры завершения работы. Что совершенно нормально, если вы запускаете их как детей реального процесса оболочки. Отказ от ответственности, я не эксперт. Эта информация только в меру моего понимания, что может быть ошибочным.
ThorSummoner

Ответы:

12

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

Чтобы ответить на два из трех ваших вопросов, однако:

  1. Я предполагаю, что bash используется наиболее широко, вероятно, за ним следует perl. Просто догадываюсь, не знаю, проводил ли кто-нибудь опрос. :)
  2. Есть несколько миллиардов скриптовых языков. :)

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

DictatorBob
источник
1
Я второй это. Я нахожу Python легким в освоении и способным делать все, что я в него бросаю, как это было в старых добрых OS / 2 днях с REXX.
Словон
3
+1 для python ... сила C в языке сценариев. Вы можете сделать ваши сценарии такими же простыми или сложными, как вы хотите;)
KFro
1
в не-NT системах модуль python shделает возможным использование python в качестве языка сценариев оболочки; Однако, если вы столкнетесь с крайними случаями (например, многопроцессорность), вам придется изучить модуль подпроцесса, который я до сих пор считаю слишком сложным для использования.
ThorSummoner
5

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

Майкл Побега
источник
2
Если вы потратите некоторое время на Perl, вы можете написать прекрасно читаемый Perl. Люди, которые пишут спагетти-код, слишком быстро обвиняют Perl в своих ошибках.
Cian
1
Я говорю только на основании опыта сисадмина; Я должен был поддерживать код, написанный другими людьми, который было почти невозможно прочитать. Обычно я просто переписываю код на Python.
Майкл Побега
3

awk для небольших рабочих мест, python для тех, кто больше чем один.

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

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

slovon
источник
1

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

EBGreen
источник
1

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

Мартин П. Хельвиг
источник
Спасибо Мартин. Я заметил (из примеров в сети), что Perl очень похож на PHP (хотя я уверен, что исторически это был Perl до PHP). Это справедливое утверждение?
Скотт Дэвис
PHP 1.0 был Perl-скриптом, так что это не случайно :)
Билл Вайс
1

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

Кроме того, Perl и Python популярны в наши дни; Я неравнодушен к Perl, но мой стиль сценариев Perl не сильно изменился с тех пор, как вышел Perl 4.

Я не знаю ни о каких "c-синтаксисоподобных" скриптовых языках.

Дэвид Макинтош
источник
1

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

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

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

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

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

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

jsoverson
источник
1
  • Рубин
  • питон
  • Go - кроссплатформенный язык, скрипты упоминаются как одна из сильных сторон Go .
  • Node.js - см. Grunt.js, Gulp.js. Многие проекты сейчас используют Node.js в качестве инструмента автоматизации оболочки.
  • Perl
Брайан Джордан
источник
1

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

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

Для запуска цепочек программ 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. Это может быть сделано, но не может полностью заменить нативную среду оболочки.

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

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

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

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

Хавьер
источник
0

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

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

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

sh1ny
источник
0

Мне нравится рубин Это просто и легко для программирования. Есть отличная книга по системному администрированию с использованием 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 }
chmeee
источник
Спасибо чмии. Я понятия не имел, что вы можете использовать Ruby для sysadmin - я всегда думал, что это веб-центр. Я ищу что-то используемое в большинстве организаций. Справедливо ли говорить, что Ruby для sysadmin все еще слишком острый?
Скотт Дэвис
1
Shell / Perl - это единственные два языка, которые вы можете с уверенностью найти установленными повсюду. Python, вероятно, следующий по распространенности, с ruby, выполняющим очень далекий четвертый (фактически, вероятно, пятый, позади awk).
Cian
@ScottDavies PHP и ASP.net - единственные веб-ориентированные языки, которые я знаю; даже Javascript, предназначенный для работы исключительно в Интернете, уже давно стал лакеем для проверки формы. Однако вы можете отправить html на любом языке, даже bash .
ThorSummoner
0

Пример с одной строкой в ​​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

Я бы использовал рубин.

Сравните с sh, это современно и мощно.

Сравните с python, это согласованность, одна редакция, один менеджер пакетов. И мне не нравится синтаксис отступа.

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

Иаков
источник