У меня есть несколько системных вызовов в Ruby, таких как следующие, и я хочу одновременно проверять их коды выхода, чтобы мой сценарий завершился, если эта команда не удалась.
system("VBoxManage createvm --name test1")
system("ruby test.rb")
Я хочу что-то вроде
system("VBoxManage createvm --name test1", 0)
<- где второй параметр проверяет код выхода и подтверждает, что этот системный вызов был успешным, а если нет, он вызовет ошибку или сделает что-то в этом роде.
Это вообще возможно?
Я пробовал что-то в этом роде, и это тоже не сработало.
system("ruby test.rb")
system("echo $?")
или
`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
raise 'Exit code is not zero'
end
exit_code
будет строка - либо,"0\n"
либо"1\n"
, поэтомуexit_code != 0
всегда будет истиннымОтветы:
Из документации :
более того
источник
[10] pry(main)> system("touch /root/test 2> /dev/null") => false [11] pry(main)> $?.exitstatus => 0 [12] pry(main)> system("touch /root/test 2> /dev/null"); $?.exitstatus => 1
system
обратных кавычек%x
и приведеноexec
здесь: stackoverflow.com/questions/6338908/…Для меня я предпочел использовать `` для вызова команд оболочки и проверки $? чтобы получить статус процесса. $? является объектом статуса процесса, вы можете получить информацию о процессе команды из этого объекта, в том числе: код статуса, статус выполнения, pid и т. д.
Некоторые полезные методы $? объект:
источник
$?
является$CHILD_STATUS
system
возвращается,false
если команда имеет ненулевой код выхода илиnil
ее нет.Следовательно
или
должны работать и достаточно лаконичны.
источник
Вы не фиксируете результат своего
system
вызова, в котором возвращается код результата:Помните, что каждый
system
вызов или эквивалент, который включает в себя метод обратной кавычки, порождает новую оболочку, поэтому невозможно захватить результат среды предыдущей оболочки. В этом случаеexit_code
есть ,true
если все получилось, вnil
противном случае.Команда
popen3
обеспечивает более низкоуровневую детализацию.источник
Open3.capture3
- особенно простой метод для такого рода задач.Один из способов сделать это - связать их, используя
and
или&&
:Второй вызов не будет выполнен, если первый не сработает.
Вы можете обернуть их в,
if ()
чтобы дать вам некоторый контроль над потоком:источник