Ich stieß auf ein interessantes Problem bei der Entwicklung eines Edelsteins, der nur unter Ubuntu zu passieren scheint. My Ruby ist Version 2.2.2 installiert mit dem Rbenv-Tool. Ich baue eine CLI (Tool A), die von einem anderen Dienstprogramm (Tool B) abhängt, das auf dem Computer installiert wird. An dem Punkt, wenn das Werkzeug B dort genannt wird, ist eine Schutzklausel, die eine Fehlermeldung ausgibt, wenn Werkzeug B nicht gefunden wird, wie folgt aus:Ubuntu: Kernel # System schlägt fehl (gibt nil zurück), wenn ich den Unix "hash" Befehl ausführe
fail "Can't do it: missing 'Tool B' utility" unless system("hash tool-b")
Ich hatte keine Probleme mit diesem auf OSX, aber auf Ubuntu system("hash tool-b")
gibt immer nil
zurück (Befehl fehlgeschlagen). Wenn ich den Beendigungscode innerhalb eines Ruby-Interpreters ($?
) drucke, bekomme ich 127
statt 0
.
Die seltsame Sache ist, dass, wenn ich hash tool-b
direkt von der Befehlszeile ausführen, der Prozess erfolgreich mit einem Status von 0
beendet. Dies scheint für mich bei der Überprüfung auf beliebige Dienstprogramm auf Ubuntu von innerhalb Ruby mit system("hash <utility>")
passieren. Ich habe das Programm geändert, um system("which tool-b")
anstelle von hash
zu verwenden, aber bin immer noch interessiert zu wissen, ob es etwas bestimmtes zu meinem Setup gibt, das das tun könnte (es ist eine Vanille Ubuntu 14.04 Box auf Amazon EC2 mit so ziemlich nichts als Rbenv, Ruby 2.2 .2, und meine Edelsteine), oder etwas über Ubuntu + Ruby, das ich nicht bekomme.
Zusammenfassung der Befehle I auf den verschiedenen Plattformen laufen lasse:
fail "Can't create cartridge: missing 'cartridge' utility" unless system("hash cartridge") # offending Ruby code
### UBUNTU COMMAND LINE
$ hash cartridge
$ echo $?
=> 0
### UBUNTU IRB
system("hash cartridge")
=> nil
puts $?
=> ... exit 127
### OSX IRB
system("hash cartridge")
=> true
puts $?
=> ... exit 0