Ruby: Shebang-Zeile

ernesto

Boskoop
Registriert
14.04.07
Beiträge
41
Hallo Leute,

Wie muss die Shebang-Zeile für Ruby unter Leopard aussehen?
(Ruby ist doch Teil der Installation?)

Der Hintergrund der Frage ist, dass mir ein Freund (der sich mit OS X nicht auskennt) ein kleines Ruby-Programm geschrieben hat, jedoch lautete seine Shebang-Zeile:

#! /usr/bin/env ruby

da dies nicht zu meinem system passt, habe ich das verzeichnis entsprechend geändert, aber nichts hat geholfen.

Ich würde mich sehr über eine Antwort freuen,

mfg
ernesto
 

mfkne

Weisser Rosenapfel
Registriert
03.04.06
Beiträge
776
bei mir ist ruby in /usr/bin/ruby, also #!/usr/bin/ruby
 

tiriqs

Cripps Pink
Registriert
26.06.06
Beiträge
155
schau doch mal mit "whereis env" oder "whereis ruby" wo die files bei dir liegen
 

tiriqs

Cripps Pink
Registriert
26.06.06
Beiträge
155
1) Zwischen dem '!' und dem ersten Zeichen des Pfades '/' darf kein Leerzeichen stehen.
2) Die Verwendung von env verwundert. Das wird was genau?

zu 2)

NAME
env -- set and print environment

das soll eine gewisse variabilität zwschen systemen schaffen...sofern env immer im gleichen pfad liegt
env gibt dann den pfad zu ruby wider
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
env gibt dann den pfad zu ruby wider
Ich weiss nicht so recht was du damit ausdrücken möchtest.
Aber irgendwie scheinst du den Sinn von env nicht so ganz verstanden zu haben.
env ist kein im System freigegebener Befehlsinterpreter (/etc/shells). Das Spiel wird nicht funktionieren, was auch immer es hätte bezwecken sollen.
 

unknown7

Kaiserapfel
Registriert
28.01.07
Beiträge
1.716
Sry für das OT:

Aber das ist der Thread im ganzen Forum bei dem ich am wenigsten kapier um was es geht :-D
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
@Rastafari: Wieso muss env in /etc/shells enthalten sein? Ein Skript mit Shebang
Code:
#!/usr/bin/env ruby
müsste eigentlich funktionieren. Halt ohne Leerzeichen nach dem !.

@unknown7: Shebang - Wikipedia
 

tiriqs

Cripps Pink
Registriert
26.06.06
Beiträge
155
Ich weiss nicht so recht was du damit ausdrücken möchtest.
Aber irgendwie scheinst du den Sinn von env nicht so ganz verstanden zu haben.
env ist kein im System freigegebener Befehlsinterpreter (/etc/shells). Das Spiel wird nicht funktionieren, was auch immer es hätte bezwecken sollen.

soweit ich das verstanden habe, startet env das programm ruby aus dem verzeichniss, in dem es installiert wurde..
dabei schaut env halt nach, wo es in dem jeweligen system installiert ist.

im shebang muss doch nicht nur ein interpreter stehen..

versuch mal #!/bin/cat

dabei wird der befehl ausgeführt und der eigene dateiname als 1.parameter übergeben
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Wieso muss env in /etc/shells enthalten sein?
Weil ein Shebang keine normale Befehlszeile ist. Ein Line-Parsing mit Word Splitting, Substitution und Argumentübergabe wie im restlichen Skript gibt es hier nicht.
Code:
man bash
Du versuchst einen Kommandointerpreter zu definieren (der in /etc/shells als "genehmigt" eingetragen sein muss), das Kommando "env" ist aber definitiv keiner.
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Dann erklär mir doch mal, wieso man (unter Tiger zumindest) folgendes Skript
Code:
#!/usr/bin/env cat
Hallo Welt!
ausführen darf (executable-Flag gesetzt, mit "./testskript" gestartet). ;)

Die Auflösung via env ist zwar nicht POSIX-standardisiert, funktioniert aber unter Linux, BSD-Unixen und wie gesagt zumindest Tiger.
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Dann erklär mir doch mal, wieso man (unter Tiger zumindest) folgendes Skript
Code:
#!/usr/bin/env cat
Hallo Welt!
ausführen darf.
Weil du es von der Console aus startest.
Ausserdem wirst du feststellen, dass das nicht im geringsten das tut was du wolltest.
 

tiriqs

Cripps Pink
Registriert
26.06.06
Beiträge
155
oder warum auch nur #!/bin/cat funzt, obwohl es nicht in etc/shells eingetragen ist
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Dann nehmen wir halt
Code:
#!/usr/bin/env perl
... tue irgend etwas ...
Das ist gleichbedeutend mit:
Code:
#!/bin/bash
/usr/bin/env perl ${*} .....
Aber nur für diejenigen Benutzerkonten, die auch eine Login-Shell haben. Gurks!
Ausserdem:
Code:
man env
 

hades

Morgenduft
Registriert
03.12.05
Beiträge
170
OT:
Darf auch was OT beisteuern - das Lesen dieses Threads hat mich heute auch davon überzeugt 1. herauszufinden was Ruby ist und 2. selbst damit anzufangen (hab ja doch schon in ein paar anderen Sprachen programmiert)
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Das ist gleichbedeutend mit:
Code:
#!/bin/bash
/usr/bin/env perl ${*} .....
Aber nur für diejenigen Benutzerkonten, die auch eine Login-Shell haben. Gurks!
Du behauptest also, ein CGI-Skript der Form sagen wir
Code:
#!/usr/bin/env ruby
print "HTTP/1.0 200 OK\r\n"
print "Content-type: text/html\r\n\r\n"
print "<html><body>Hello World!</body></html>\r\n"
(klick) würde nicht funktionieren?
 

ernesto

Boskoop
Registriert
14.04.07
Beiträge
41
Hallo,
erstmal Danke für die zahlreichen Antworten.

Ich habe das Problem immernoch... Das Leerzeichen war im Programm selbst nicht enhalten, war mein eigener Fehler beim Schreiben des Beitrags, entschuldigt dafür.

das Verzeichnis /usr/bin/env ist tatsächlich auch bei mir genauso vorhanden. Also liegt es nicht wie ursprünglich gedacht daran.

@rastafari
Es soll mir eine Latex-Datei generieren, in der bestimmte Art von mathematischen Diagrammen codiert ist. Ich muss dann nur noch einen simplen Code in eine Text-Datei (im folgenden "test.ssp" genannt) schreiben, die die Informationen enthält, wie mein Diagramm aufgebaut werden soll (Weil ich viele solcher Diagramme benötige, hatte mein Freund die Idee, ein Prgramm für diese Übersetzung zu schreiben) Er hat nun ein Ruby-Programm (in der Datei "ssp.rb", worin natürlich auch die besagte Shebang-Zeile steht) geschrieben und ich soll es mit

./ssp.rb test.ssp

aufrufen. Aber das Terminal gibt daraufhin "env: ruby\r: No such file or directory" aus. Daraus ziehe ich den Schluß, dass Ruby nicht aus diesem Verzeichnis aus geladen werden kann. Eine Ersetzung in der Sheband-Zeile von "env" zu "ruby" bringt auch nichts.

Habt ihr vielleicht noch eine andere Idee, woran es liegen könnte?

Gruß
ernesto