Устранение ошибок командной строки с использованием% x
Всякий раз, когда вы хотите что-то выполнить в командной строке, вы можете использовать следующий синтаксис:
%x(command to run)
Однако я хочу поймать ошибку или, по крайней мере, получить ответ, чтобы я мог правильно его разобрать. Я пробовал настройку:
result = %x(command to run)
и используя try-catch
begin
%x(command to run)
rescue
"didn't work"
end
безрезультатно. Как я могу захватить результаты, а не распечатывать их?
Ответы
Ответ 1
Итак, это напрямую не отвечает на ваш вопрос (не будет выводить вывод команды). Но вместо того, чтобы пытаться begin
/rescue
, вы можете просто проверить код выхода ($?
) команды:
%x(command to run)
unless $? == 0
"ack! error occurred"
end
Изменить: просто запомнил этот новый проект. Я думаю, что он делает именно то, что вы хотите:
https://github.com/envato/safe_shell
Ответ 2
Вы можете перенаправить stderr на stdout:
result = %x(command to run 2>&1)
Или, если вы хотите отделить сообщения об ошибках от фактического вывода, вы можете использовать popen3:
require 'open3'
stdin, stdout, stderr = Open3.popen3("find /proc")
Затем вы можете прочитать фактический вывод из сообщений stdout и ошибок из stderr.
Ответ 3
Вам нужно сочетание ответов @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
Ответ 4
Здесь, как использовать Ruby open3:
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 doc. Там много приятных функций.