J'ai réduit un problème auquel je fais face à un MWE. Quelqu'un peut-il confirmer si c'est un bug ou s'il me manque quelque chose de rudimentaire?Pourquoi l'état de sortie de l'appel system() dans Ruby change-t-il avec la redirection?
Plate-forme:
- Ruby 1.9.3p484 (révision 22.11.2013 43786) [x86_64 Linux]
- bash GNU version 4.3.11 (1) -release (x86_64- pc-linux-gnu)
- Ubuntu 14.04.2 x86_64
Étape 1: Créer un script Ruby comme suit nommé demo.rb
ret = system("./segfault")
print "Return value: ", ret, "\n"
print "Exit status: ", ($?.exitstatus) ? $?.exitstatus : "nil", "\n"
print "Status code: ", $?.to_i, "\n"
puts "-----------------------------------"
ret = system("./segfault 2>&1")
print "Return value: ", ret, "\n"
print "Exit status: ", ($?.exitstatus) ? $?.exitstatus : "nil", "\n"
print "Status code: ", $?.to_i, "\n"
Étape 2: Créer un programme C comme suit le nom segfault.c
#include <string.h>
int main()
{
memset((char *)0x0, 1, 100);
return 1;
}
Étape 3: Compile le programme C.
gcc segfault.c -o segfault
Étape 4: Exécutez le script Ruby.
$ ruby segfault.rb
Return value: false
Exit status: nil
Status code: 139
-----------------------------------
sh: line 1: 8181 Segmentation fault (core dumped) ./segfault 2>&1
Return value: false
Exit status: 139
Status code: 35584
Je ne peux pas comprendre pourquoi l'état de sortie et les changements de code d'état avec stderr
étant redirigent à stdout
. Quelqu'un at-il une explication raisonnable de ce comportement?
Même moi, je l'ai vu '$ ?. to_i == 11' en autres cas. Je ne suis pas en mesure de reproduire la même chose cependant. Il apparaît juste dans un autre programme plus grand, apparemment au hasard. Par conséquent, je ne peux pas vraiment compter sur '$?'. Quelle combinaison de Bash/Ruby utilisez-vous? –
Si j'utilise 'system (" ./ segfault ", err:: out), ce qui suit n'apparaît pas:' sh: ligne 1: 8181 Erreur de segmentation (core dumped) ./segfault 2> & 1' –
Ruby 2.3 .0, bash 3.2.57. Personnellement j'éviterais toujours l'utilisation de la coquille en invoquant la forme du système –