Почему и когда использовать оболочку вместо 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 для таких задач.