Почему и когда использовать оболочку вместо Ruby

Так как я хорошо знаком с Ruby, я немного обману Но потом я подумал, возможно, я скучаю по лодке. Я знаю много причин, чтобы предпочесть Ruby над Bash (или каким-либо SH-совместимым интерпретатором языка команд), но я не знаю причин, по которым это не так. Каков потенциал прямого программирования оболочки?

Я намерен использовать системные команды, используя system, когда это необходимо.

Примечание: Я уже знаю, что Ruby не всегда будет там, но меня интересуют главным образом технические, семантические и синтаксические критерии.

Изменить: В Ruby не всегда присутствует, я имею в виду, что это не стандартная часть всех дистрибутивов * nix, в отличие от vi.

Ответ 1

Язык программирования оболочки ужасен для всех, кроме одного.

Трубопроводы.

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

Операторы |, & и ;, плюс () и `` `образуют аккуратный язык для описания конвейеров.

a & b является параллельным

a ; b является последовательным

a | b является конвейером, где каналы b

Эта часть команд программирования оболочки.

Подумайте о ( a & b & c ) | tee capture | analysis как о том, что трудно выразить в Python (или Ruby). Вы можете многое сделать с помощью iterpipes, но не совсем все.

В остальном вы можете жить без него и использовать Python (или Ruby), и вы будете счастливее и продуктивнее.

Самое главное, на что нужно обратить внимание, - это что-то, что связано с expr на уровне оболочки. Как только вы начнете делать "вычисления", вы вышли из сладости оболочки, и вы должны прекратить программирование в оболочке и переосмыслить, что вы делаете.

Ответ 2

Ruby имеет огромное преимущество: вы знаете Ruby и (я полагаю), что вы не знаете Bash, что хорошо!

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

Я бы посоветовал вам использовать Bash для всего, что достаточно просто, чтобы вы могли заранее выполнить его в командной строке, например:

who |grep -i admin |cut -c10-20 

- и используйте Ruby для чего-нибудь еще

Ответ 3

Основной функцией bash является запуск других приложений командной строки. Обеспечение взаимодействия этих программ друг с другом и т.д. Это не то, для чего предназначен рубин (правильно?).

Ответ 4

Прямая запись Posix или bash script хорошо работает для операций, которые перебирают списки файлов. Такие вещи, как

find . -name \*.htm | while read x; do
   # whatever
done

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

Переход к чему-то вроде Ruby происходит, когда требуется какая-то внутренняя структура данных. Оболочка - это макропроцессор, поэтому он способен на что-то вроде метапрограммирования, в котором вы составляете имена переменных. В некоторых версиях bash есть массивы, и все версии могут "метапрограммировать" имена переменных, где индекс является частью имени.

Но это 100% взлома и даже встроенные массивы являются грубыми. После принятия решений и сохранения структур данных время перехода на Ruby.

Ответ 5

Я не вижу никаких проблем с Ruby. Вы можете использовать back-tick вместо system и вставлять строки в строку, например

`cp ${source} ${dest}` 

Кроме того, вы можете легко получить содержимое stdout (не уверен в stdin) и сформировать свою собственную небольшую конвейерную вещь.

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

Ответ 6

Комментарии о том, как обрабатывается оболочка трубопровода, находятся на месте. Однако, если вас интересует рубиновый подход к оболочке, вы можете посмотреть rush. Есть непосредственные наблюдения (за исключением того, как обрабатываются трубопроводы), такие как пути теперь обрабатываются совершенно по-другому, но если вы хотите, это легкость рубиновых вещей, таких как итераторы и блоки, которые у вас есть у вас под рукой.

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

[Изменить] Быстрый взгляд вокруг появился ipython, который выглядит (беглым взглядом), чтобы дать больше естественного ощущения оболочки, которая может или не может быть стимулом для вас.

Ответ 7

@OP, если вы хотите сравнить Ruby vs Shell, сравните с помощью интерпретатора Ruby (без библиотек/модулей). т.е. сравнить его встроенные с оболочкой. В противном случае они почти одинаковы. Зачем? Например, если вы хотите выполнять расширенную математику, отличную от той, которая предоставляется оболочкой, оболочка может использовать bc/awk/dc. Это математические "библиотеки" для оболочки. Если вам нужны структуры даты, например ассоциативные массивы, вы можете использовать awk. (эквивалент хэшам в рубине). В современной оболочке bash существуют также ассоциативные массивы. Вы можете думать о * nix внешних инструментах (например, wc, grep, sed и т.д., А также в /usr/bin/,/usr/sbin и т.д.) В качестве "библиотек" оболочки.

Наконец, если вы намерены использовать system() много в Ruby, я предлагаю использовать оболочку как один из них, оболочка выделяется в трубах. и т.д..

Ответ 8

Язык программирования оболочки имеет очень малую площадь и очень мало зависимостей. Кроме того, я не вижу смысла использовать его. Personnaly Я предпочитаю использовать Perl или python для таких задач.