Вызывать исключение при сбое команды оболочки? - PullRequest
6 голосов
/ 09 февраля 2010

Я пишу некоторые скрипты на Ruby, и мне нужно взаимодействовать с не-Ruby-кодом с помощью команд оболочки.Я знаю, что есть по крайней мере 6 различных способов выполнения команд оболочки из Ruby, но, к сожалению, ни один из них, кажется, не останавливает выполнение при сбое команды оболочки.что-то, что эквивалентно:

set -o errexit

... в скрипте Bash.В идеале решение должно вызывать исключение в случае сбоя команды (т. Е. Путем проверки ненулевого возвращаемого значения), возможно, с использованием stderr в качестве сообщения.Это не было бы слишком сложно написать, но кажется, что это уже должно существовать.Есть ли вариант, который я просто не нахожу?

Ответы [ 4 ]

9 голосов
/ 09 февраля 2010

Самый простой способ - создать новую функцию (или переопределить существующую) для вызова system () и проверки кода ошибки.

Что-то вроде:

old_sys = system

def system(...)
  old_system(...)
  if $? != 0 then raise :some_exception
end

Это должно делать то, что вы хотите.

7 голосов
/ 22 декабря 2013

Tiny немного проще: вам не нужно проверять $? w / system, и поскольку команда, которую вы запустили, будет выводить на stderr сама, вы обычно можете просто не выходить из нуля, а не вызывать исключение с ужасной трассировкой стека:

system("<command>") || exit(1)

Так что вы можете сделать еще один шаг и сделать:

(system("<command 1>") &&
  system("<command 2>") &&
  system("<command 3>")) || exit(1)

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

Ссылка: из документа Ruby 2.0 для system (хотя верно и для 1.8.7):

система возвращает true, если команда дает нулевой статус выхода, false для ненулевого статуса выхода.

* ** тысячу двадцать-один * -doc.org одна тысяча двадцать-два / ядро-2.0.0 / Kernel.html # метод-я-система

7 голосов
/ 09 февраля 2010

Вы можете использовать одну из специальных переменных ruby. $? (аналогично тому же сценарию оболочки var).

`ls`
if $?.to_s == "0"
  # Ok to go
else
  # Not ok
end

Почти все программы устанавливают это значение в 0, если все прошло нормально.

2 голосов
/ 10 января 2019

Ruby 2.6 добавляет аргумент exception: :

system('ctat nonexistent.txt', exception: true) # Errno::ENOENT (No such file or directory - ctat)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...