2009-01-08 5 views
5

Ich bin neu in der Programmierung und versuche, ein Beispiel zu folgen, die # verwendet! Kommentar in Rubin.Mit einem #! Kommentar in Ruby läuft in Ubuntu

ich konsequent die Botschaft bin erhalten: bash: matz.rb: #: Befehl nicht

ich diesen Kommentar verwenden gefunden!/usr/bin/env ruby ​​

Ich habe es mit und ohne den Raum danach versucht! sowie mit und ohne das env.

wenn ich die $, die rubin

Rubin in ist:/usr/bin/ruby ​​

Ich habe auch in das Betriebssystem weg und änderte die Berechtigungen für die Datei matz.rb zu rwx für alle Benutzer ohne Wirkung. Mache ich etwas falsch oder habe ich mein System falsch eingerichtet?

Antwort

0

Haben Sie den ShaBang wie folgt versucht, um direkt auf Ruby zu zeigen?

#! /usr/bin/ruby 

Dann rufen Sie das Skript von der Kommandozeile als

./matz.rb 

Unter Unix/Linux-Systemen den Punkt vor einem Befehl für den Befehl im aktuellen Verzeichnis zu suchen. Wenn Sie einen Pfad wie/usr/bin/ruby ​​angeben, wird im aktuellen Verzeichnis nach einem Verzeichnis mit dem Namen usr gesucht ...

Ein Befehl ohne einen Punkt/vorne wird an Stellen durchsucht, die durch die Pfadvariable angegeben sind die Umgebung.

Ein Befehl mit einem/am Anfang wird genau von der Wurzel gesucht, die dem angegebenen Pfad folgt.

In Ihrem ShaBang möchten Sie den genauen Pfad zum Interpreter angeben, damit "/ usr/bin/ruby" der richtige ist. In der Kommandozeile, wo das Skript ausgeführt werden soll, müssen Sie das Skript mit "./matz.rb" aufrufen, sonst wird die bash einen Befehl wie /usr/bin/matz.rb suchen, was zu Ihrer Fehlermeldung führt.

+0

-1 als #/usr/bin/env ruby ​​ist besser (und ebenso richtig) da ruby ​​nicht immer in/usr/bin ist, während env immer sein sollte. –

9

Wenn Sie im selben Verzeichnis wie die Datei matz.rb sind, dann sollten Sie es als

$ ./matz.rb 

und nicht nur

$ matz.rb 

Hier ist eine Shell-Sitzung demonstriert diese Arbeit auszuführen:

$ ls -la m* 
-rwxr-xr-x 1 gareth gareth 32 8 Jan 08:46 matz.rb 
$ cat matz.rb 
#!/usr/bin/env ruby 
puts "Matz" 
$ matz.rb 
-bash: matz.rb: command not found 
$ ./matz.rb 
Matz 
10

Der /usr/bin/env Teil ist in Ordnung. Sie müssen bash den Pfad zu matz.rb geben, wenn Sie es ausführen. Wenn Sie sich im Verzeichnis mit matz.rb befinden, geben Sie "./matz.rb" ein. Das Verzeichnis "." bedeutet das aktuelle Verzeichnis - bash sucht dort nicht standardmäßig nach Programmen (wie Windows).

Das Env-Programm (/ usr/bin/env) durchsucht den ausführbaren Suchpfad - die Umgebungsvariable PATH - für das Programm ruby, als ob Sie es an der Eingabeaufforderung eingegeben hätten, und führt das Programm aus. Der Shebang-Kommentar tut das nicht.Wenn Sie Ihr Skript anderen Leuten geben möchten, die Ruby nicht an derselben Stelle installiert haben wie Sie, sollten Sie den Kommentar "#!/usr/bin/env ruby" verwenden, damit es funktioniert, solange sie Ruby durch Eingabe von "Ruby" ausführen können.

2

Es klingt wie Sie auf einem Unix/Linux-System sind und einfach in der Befehlszeile eingeben. Wenn Sie versuchen, einen Befehl im aktuellen Verzeichnis auszuführen, müssen Sie ihn wie ./matz.rb aufrufen. Das "./" sagt ihm, dass er in das aktuelle Verzeichnis schauen soll und nicht nur in/usr/bin und seine Freunde.

3

Ihre Datei wurde nicht in Windows erstellt, oder? Wenn es Zeilenenden hat, wird das Bash verärgern. Sie können es mit Vim öffnen und überprüfen:

vi matz.rb 
:set ff=unix 
:wq 

Wenn, wenn Sie Tabula vollständig auf dem „ff =“ Teil es dos sagt, dann ist es die falsche Dateiformat hat. Alternativ laufen dos2unix und versuchen, die Datei erneut auszuführen:

apt-get install sysutils 
dos2unix matz.rb 
1

Ich konnte keine Antwort sehen anzeigt, dass Sie die ausführbare Modus der Datei zu ändern, so dass Sie versuchen und tun möchte, könnte

chmod +x matz.rb 

bevor Sie es

./matz.rb 

auch besser tun könnte gehen und nicht versuchen, eine .rb Erweiterung der Datei anhängen, wie der Fall für normale Rubin/Schienen-Skripte zB/script erzeugt, script/console usw.

1

Sie können die 'shebang' Linie mit entweder:

#!/usr/bin/ruby 
#!/usr/bin/env ruby 

Aber das Skript muss ausführbar sein (Sie angegeben ist) und in dem Shell $ PATH .

echo $PATH 

Legen Sie das Skript in einem dieser Verzeichnisse oder Ihren Weg ändern, geben Sie sonst den vollständigen Pfad, um es zum Beispiel:

export PATH=$PATH:/home/user/bin 

oder einer der folgenden:

./matz.rb 
/home/user/bin/matz.rb 

Sie können den Ruby-Interpreter auch ausführen, indem Sie den Skriptdateinamen als Argument übergeben, und er wird ausgeführt. Dies ist besonders nützlich, wenn Sie eine andere Version von Ruby auf Ihrem System installiert haben (sagen wir, für die Prüfung, wie Ruby Enterprise Edition, REE):

/usr/bin/ruby matz.rb 
/opt/ree/bin/ruby matz.rb 
+0

"#!/Usr/bin/env ruby" arbeitete für mich auf Ubuntu 12.10 mit Ruby 1.9.3p194. Prost Kumpel. – Gregology

Verwandte Themen