Язык программирования оболочки ужасен для всех, кроме одного.
Трубопроводы.
Язык программирования оболочки для конвейеров совершенно потрясающий.
Операторы |
, &
и ;
плюс ()
и «образуют аккуратный маленький язык для описания конвейеров. .
a & b
является параллельным
a; b
является последовательным
a | b
- конвейер, по которому a питает b
эту часть программных камней оболочки.
Подумайте о (a & b & c) | тройник захват | анализ
как вещь, которую трудно выразить в Python (или Ruby). Вы можете сделать многое из этого с помощью iterpipe , но не полностью.
Вы можете жить без большей части остального и использовать Python (или Ruby), и вы будете счастливее и продуктивнее.
Самое главное, чего следует остерегаться, - это все, что связано с expr
на уровне оболочки. Как только вы начинаете пытаться выполнять «вычисления», вы выходите из зоны наилучшего восприятия оболочки, и вам следует прекратить программировать в оболочке и переосмыслить то, что вы делаете.
Функция strtol
в стандартной библиотеке принимает «базовый» параметр, который в этом случае будет 2.
int fromBinary(const char *s) {
return (int) strtol(s, NULL, 2);
}
(первый код C, написанный мною примерно за 8 лет: -)
-121--3224851-Вы можете попробовать
<% f.fields_for :project, Project.new do |project_form| %>
<%= render :partial => 'project', :locals => {:f => project_form} %>
<% end %>
, чтобы дать вам пустые поля для одной записи.
В контроллере можно создать несколько записей для отношения
5.times { @user.projects.build }
Это сделает пять новых пустых проектов, связанных с пользователем, и ваш текущий fields_for будет иметь поля для новых записей.
-121--3977790- Я не вижу никаких проблем с Руби. Вы можете использовать back-tick вместо системы
и вставить вещи в линию, как
`cp ${source} ${dest}`
Также, вы можете легко получить содержимое stdout (не уверен в stdin) и сформировать свой собственный маленький pipelining вещь.
Я думаю, что Руби является выигрышем для выполнения сценариев вещи, но менее, как общая оболочка из-за неуклюжий бит всегда должны помнить, чтобы положить назад-галочки для выполнения команд.
Основная функциональность bash заключается в запуске других приложений командной строки. Заставлять эти программы взаимодействовать друг с другом и т.д. Это не то, для чего предназначен ruby (верно?).
Непосредственное написание сценария Posix или bash хорошо подходит для операций, которые перебирают списки файлов. Такие вещи, как
find . -name \*.htm | while read x; do
# whatever
done
Оболочка может достаточно хорошо выполнять подстановку команд и простые преобразования параметров. Процедуры оболочки позволяют довольно сложным программам быть разумно модульными.
Переход к чему-то вроде Ruby происходит, когда требуется какая-то внутренняя структура данных. Оболочка - это макропроцессор, поэтому он может выполнять что-то вроде «метапрограммирования», когда вы придумываете имена переменных. Некоторые версии bash имеют массивы, и все версии могут «метапрограммировать» имена переменных, в которых индекс является частью имени.
Но это 100% взлом, и даже встроенные массивы грубые. Когда необходимо принять решения и сохранить структуры данных, пора переходить на Ruby.
Комментарии о том, как оболочка обрабатывает трубопроводы, точны. Однако, если вас интересует рубиновый подход к оболочке, вы можете посмотреть rush . Есть непосредственные наблюдения (помимо того, как обрабатывается трубопровод), например, пути теперь обрабатываются совершенно по-другому, но если вам нужна простота рубиновых вещей, таких как итераторы и блоки, это у вас под рукой.
В любом случае, скорее всего, это не полная замена, но может послужить вашим целям.
[Edit] Беглый взгляд на ipython позволяет увидеть (беглым взглядом) больше естественное ощущение среды оболочки, которая может быть для вас стимулом, а может и не быть.
У языков программирования Shell очень мало места и очень мало зависимостей. Кроме того, я не вижу особого смысла в его использовании. Лично я предпочитаю использовать Perl или python для таких задач.
@OP, если вы хотите сравнить Ruby и Shell, сравните с использованием интерпретатора Ruby (без библиотек / модулей). т.е. сравнить его встроенные функции с оболочкой. В остальном они почти одинаковы. Почему? Например, если вы хотите выполнять сложные математические операции, отличные от тех, которые предоставляет оболочка, оболочка может использовать bc / awk / dc. Это математические «библиотеки» оболочки. Если вам нужны структуры даты, такие как ассоциативные массивы, вы можете использовать awk. (эквивалент хешей в рубине). В современной оболочке bash также есть ассоциативные массивы. Вы можете думать о внешних инструментах * nix (например, wc, grep, sed и т. Д. И в / usr / bin /, / usr / sbin и т. Д.) Как о «библиотеках» оболочки.
Наконец, если вы собираетесь часто использовать system () в Ruby, я предлагаю использовать оболочку, как упоминалось в одном из них, оболочка выделяется в конвейерах. и т. д.
Ruby имеет огромное преимущество: вы знаете Ruby и (я полагаю) вы не так хорошо знаете Bash!
Лично Я использую Ruby для сложных сценариев и Bash для простых - точкой останова для меня обычно является все, что действительно имеет правильный набор параметров командной строки, - но тогда я знаю и Bash, и Ruby.
Я бы посоветовал вам используйте Bash для всего, что достаточно просто, чтобы вы могли заранее решить это в командной строке, например:
who |grep -i admin |cut -c10-20
- и используйте Ruby для всего остального