Перехват ошибок командной строки с использованием% x - PullRequest
12 голосов
/ 23 января 2011

Всякий раз, когда вы хотите выполнить что-то в командной строке, вы можете использовать следующий синтаксис:

%x(command to run)

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

result = %x(command to run)

и использовать try-catch

begin
  %x(command to run)
rescue
  "didn't work"
end

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

Ответы [ 4 ]

13 голосов
/ 23 января 2011

Так что это не дает прямого ответа на ваш вопрос (не фиксирует вывод команды). Но вместо попытки begin / rescue вы можете просто проверить код выхода ($?) команды:

%x(command to run)
unless $? == 0
   "ack! error occurred"
end

Редактировать : Только что вспомнил этот новый проект. Я думаю, что это именно то, что вы хотите:

https://github.com/envato/safe_shell

12 голосов
/ 23 января 2011

Возможно, вы захотите перенаправить stderr на stdout :

result = %x(command to run 2>&1)

Или, если вы хотите отделить сообщения об ошибках от фактического вывода, вы можете использоватьpopen3:

require 'open3'
stdin, stdout, stderr = Open3.popen3("find /proc")

Затем вы можете прочитать фактический вывод из stdout и сообщения об ошибках из stderr.

9 голосов
/ 23 января 2011

Вам нужно сочетание ответа @Cam и ответа @tonttu.

decent explanation of $? and others.

Редактировать: домен http://blog.purifyapp.com теперь находится в руках мошенника и мошенника.

result = %x(command to run 2>&1)

unless $? == 0 #check if the child process exited cleanly.
    puts "got error #{result}"
end
8 голосов
/ 23 января 2011

Вот как использовать open3 Ruby:

require 'open3'
include Open3

stdin, stdout, stderr = popen3('date')
stdin.close

puts
puts "Reading STDOUT"
print stdout.read
stdout.close

puts
puts "Reading STDERR"
print stderr.read
stderr.close
# >> 
# >> Reading STDOUT
# >> Sat Jan 22 20:03:13 MST 2011
# >> 
# >> Reading STDERR

popen3 возвращает потоки ввода-вывода для STDIN, STDOUT и STDERR, что позволяет вам выполнять ввод-вывод в открытое приложение.

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

Вы должны прочитать из возвращенных каналов STDOUT и STDERR.Они автоматически не помещают содержимое в мистическую переменную.

В общем, мне нравится использовать блок с popen3, потому что он выполняет очистку за собой.

Просмотрите примеры в Open3 док.Там много приятного функционала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...