Подтвердить что ты не робот

Устранение ошибок командной строки с использованием% x

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

%x(command to run)

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

result = %x(command to run)

и используя try-catch

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

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

4b9b3361

Ответ 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. Там много приятных функций.