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

18
задан skaffman 19 December 2013 в 02:17
поделиться

8 ответов

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

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

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

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

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

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

a | b - конвейер, по которому a питает b

эту часть программных камней оболочки.

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

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

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

22
ответ дан 30 November 2019 в 07:33
поделиться

Функция 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 вещь.

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

1
ответ дан 30 November 2019 в 07:33
поделиться

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

2
ответ дан 30 November 2019 в 07:33
поделиться

Непосредственное написание сценария Posix или bash хорошо подходит для операций, которые перебирают списки файлов. Такие вещи, как

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

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

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

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

2
ответ дан 30 November 2019 в 07:33
поделиться

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

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

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

1
ответ дан 30 November 2019 в 07:33
поделиться

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

0
ответ дан 30 November 2019 в 07:33
поделиться

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

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

1
ответ дан 30 November 2019 в 07:33
поделиться

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

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

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

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

- и используйте Ruby для всего остального

6
ответ дан 30 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: