Я пишу некоторые сценарии в Ruby, и я должен взаимодействовать через интерфейс с некоторым некодом Ruby через команды оболочки. Я знаю, что существует по крайней мере 6 различных способов выполнить команды оболочки от Ruby, к сожалению, ни один из них, кажется, не останавливает выполнение, когда команда оболочки перестала работать.
В основном я ищу что-то, что делает эквивалент:
set -o errexit
... в сценарии Bash. Идеально, решение повысило бы исключение, когда команда перестала работать (т.е. путем проверки на ненулевое возвращаемое значение), возможно, с stderr как сообщение. Это не было бы слишком трудно для записи, но кажется, что это уже должно существовать. Существует ли опция, которую я просто не нахожу?
Самый простой способ - создать новую функцию (или переопределите существующий), чтобы вызвать system () и проверить код ошибки.
Примерно так:
old_sys = system
def system(...)
old_system(...)
if $? != 0 then raise :some_exception
end
Это должно делать то, что вы хотите.
Вы можете использовать одну из специальных переменных Ruby. $? (аналог того же сценария оболочки var).
`ls`
if $?.to_s == "0"
# Ok to go
else
# Not ok
end
Почти каждая программа устанавливает эту переменную в 0, если все прошло нормально.