Eu tenho um monte de chamadas de sistema em ruby, como a seguir, e quero verificar seus códigos de saída simultaneamente para que meu script saia se o comando falhar.
system("VBoxManage createvm --name test1")
system("ruby test.rb")
Eu quero algo como
system("VBoxManage createvm --name test1", 0)
<- onde o segundo parâmetro verifica o código de saída e confirma que a chamada do sistema foi bem-sucedida e, se não, gerará um erro ou fará algo desse tipo.
Isso é sequer possível?
Tentei algo parecido com isso e também não funcionou.
system("ruby test.rb")
system("echo $?")
ou
`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
raise 'Exit code is not zero'
end
exit_code
será uma string -"0\n"
ou"1\n"
, entãoexit_code != 0
sempre será verdadeiroRespostas:
Da documentação :
além disso
fonte
[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
backticks,%x
eexec
fornecida aqui: stackoverflow.com/questions/6338908/…Para mim, preferi usar `` para chamar os comandos do shell e verificar $? para obter o status do processo. O $? é um objeto de status do processo, você pode obter as informações do processo do comando a partir deste objeto, incluindo: código de status, status de execução, pid, etc.
Alguns métodos úteis do $? objeto:
fonte
$?
é$CHILD_STATUS
system
retornafalse
se o comando tiver um código de saída diferente de zero ounil
se não houver comando.Portanto
ou
devem funcionar e são razoavelmente concisos.
fonte
Você não está capturando o resultado da sua
system
chamada, que é onde o código do resultado é retornado:Lembre-se de que cada
system
chamada ou equivalente, que inclui o método backtick, gera um novo shell, portanto, não é possível capturar o resultado de um ambiente de shell anterior. Nesse caso,exit_code
étrue
se tudo deu certo,nil
caso contrário.O
popen3
comando fornece mais detalhes de baixo nível.fonte
Open3.capture3
é um método particularmente fácil de usar para esse tipo de tarefa.Uma maneira de fazer isso é encadeá-los usando
and
ou&&
:A segunda chamada não será executada se a primeira falhar.
Você pode envolvê-los em um
if ()
para obter algum controle de fluxo:fonte