Вызов команд оболочки из Ruby

Spring позволяет передавать java.util.Lists в NamedParameterJdbcTemplate , который автоматизирует генерацию (?,?,?, ...,?), в зависимости от количества аргументов.

Для Oracle в этом блоге сообщение обсуждается использование oracle.sql.ARRAY (Connection.createArrayOf не работает с Oracle). Для этого вам нужно изменить инструкцию SQL:

SELECT my_column FROM my_table where search_column IN (select COLUMN_VALUE from table(?))

Функция таблицы oracle table преобразует переданный массив в таблицу как значение, которое можно использовать в инструкции IN.

988
задан Andrew Marshall 6 March 2015 в 02:10
поделиться

8 ответов

Это объяснение основано на прокомментированном сценарий Ruby от моего друга. Если Вы хотите улучшить сценарий, не стесняйтесь обновлять его в ссылке.

Первый, обратите внимание, что, когда Ruby обращается к оболочке, он обычно звонит /bin/sh, не Bash. Некоторый синтаксис Bash не поддерживается /bin/sh во всех системах.

Вот способы выполнить сценарий оболочки:

cmd = "echo 'hi'" # Sample string that can be used
  1. Kernel#`, обычно называемые обратные галочки †“`cmd`

    Это похоже на многие другие языки, включая Bash, PHP и Perl.

    Возвраты результат команды оболочки.

    Документы: http://ruby-doc.org/core/Kernel.html#method-i-60

    value = `echo 'hi'`
    value = `#{cmd}`
    
  2. Встроенный синтаксис, %x( cmd )

    После x символ является разделителем, который может быть любым символом. Если разделитель является одним из символов (, [, {, или <, литерал состоит из символов до соответствия заключительный разделитель, принимая во внимание вложенных пар разделителя. Для всех других разделителей литерал включает символы до следующего возникновения символа-разделителя. Строковая интерполяция #{ ... } позволяется.

    Возвраты результат команды оболочки, точно так же, как обратные галочки.

    Документы: http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html

    value = %x( echo 'hi' )
    value = %x[ #{cmd} ]
    
  3. Kernel#system

    Выполняет данную команду в подоболочке.

    Возвраты true, если команда была найдена и выполнена успешно, false иначе.

    Документы: http://ruby-doc.org/core/Kernel.html#method-i-system

    wasGood = system( "echo 'hi'" )
    wasGood = system( cmd )
    
  4. Kernel#exec

    Замены текущий процесс путем выполнения данной внешней команды.

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

    Документы: http://ruby-doc.org/core/Kernel.html#method-i-exec

    exec( "echo 'hi'" )
    exec( cmd ) # Note: this will never be reached because of the line above
    

Вот некоторый дополнительный совет: $?, то, которое совпадает с $CHILD_STATUS, получает доступ к состоянию выполняемой команды последней системы, если Вы используете обратные галочки, system() или %x{}. Можно тогда получить доступ exitstatus и pid свойства:

$?.exitstatus

Для большего количества чтения см.:

1249
ответ дан RonU 6 March 2015 в 02:10
поделиться

Можно также использовать операторы обратной галочки ('), подобный Perl:

directoryListing = `ls /`
puts directoryListing # prints the contents of the root directory

Удобный, если Вам нужно что-то простое.

то, Какой метод Вы хотите использовать, зависит от точно, что Вы пытаетесь выполнить; проверьте документы на большее количество деталей о различных методах.

7
ответ дан Rufo Sanchez 6 March 2015 в 02:10
поделиться

Мой фаворит Open3

  require "open3"

  Open3.popen3('nroff -man') { |stdin, stdout, stderr| ... }
33
ответ дан Dominic K 6 March 2015 в 02:10
поделиться

Я - определенно не эксперт Ruby, но я дам ему выстрел:

$ irb 
system "echo Hi"
Hi
=> true

необходимо также быть в состоянии сделать вещи как:

cmd = 'ls'
system(cmd)
20
ответ дан the Tin Man 6 March 2015 в 02:10
поделиться

Вот лучшая статья, по-моему, о выполнении сценариев оболочки в Ruby: " 6 Способов Выполнить Команды Shell в Ruby".

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

мне был нужен более усовершенствованный материал как STDOUT и STDERR, таким образом, я использовал драгоценный камень Open4. У Вас есть все методы, объясненные там.

60
ответ дан the Tin Man 6 March 2015 в 02:10
поделиться

Путем мне нравится делать, это использует %x литерал, который облегчает (и читаемый!) для использования кавычек в команде, как так:

directorylist = %x[find . -name '*test.rb' | sort]

, Который, в этом случае, заполнит список файлов со всеми тестовыми файлами под текущим каталогом, который можно обработать как ожидалось:

directorylist.each do |filename|
  filename.chomp!
  # work with file
end
156
ответ дан Andrew Marshall 6 March 2015 в 02:10
поделиться

Некоторые вещи думать о при выборе между этими механизмами:

  1. Вы просто хотите stdout, или Вам нужен stderr также? или даже выделенный?
  2. , Насколько большой Ваш вывод? Вы хотите держать весь результат в памяти?
  3. Вы хотите считать часть своего вывода, в то время как подпроцесс все еще работает?
  4. Вы должны закончиться коды?
  5. Вам нужен рубиновый объект, который представляет процесс и позволяет Вам уничтожить его по требованию?

Вам, возможно, понадобится что-либо от простых обратных галочек (''), система (), и IO.popen к полноценному Kernel.fork / Kernel.exec с IO.pipe и IO.select.

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

, К сожалению, это очень зависит .

23
ответ дан the Tin Man 6 March 2015 в 02:10
поделиться

Еще один вариант:

Когда вам:

  • нужен stderr, а также stdout
  • , нельзя / не будет использовать Open3 / Open4 (они генерируют исключения в NetBeans на мой Mac, не знаю почему)

Вы можете использовать перенаправление оболочки:

puts %x[cat bogus.txt].inspect
  => ""

puts %x[cat bogus.txt 2>&1].inspect
  => "cat: bogus.txt: No such file or directory\n"

Синтаксис 2> & 1 работает в Linux , Mac и Windows , поскольку первые дни MS-DOS.

23
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

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