2016-07-20 2 views
0

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 

Antwort

1

Kernel#system verwendet das System der Schale, das heißt /bin/sh auszuführen. hash wurde nur in POSIX.2013 zum Basissystem hinzugefügt, davor war es optional. Ich glaube dash, die Standard-System-Shell, die Ubuntu verwendet, ist noch nicht POSIX.2013-konform und hat daher hash (noch) nicht.

macOS/OSX verwendet Bash als seine System-Shell, die hat haben hash.

Verwandte Themen