• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

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
 
bei mir ist ruby in /usr/bin/ruby, also #!/usr/bin/ruby
 
schau doch mal mit "whereis env" oder "whereis ruby" wo die files bei dir liegen
 
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
 
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.
 
Sry für das OT:

Aber das ist der Thread im ganzen Forum bei dem ich am wenigsten kapier um was es geht :-D
 
@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
 
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
 
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.
 
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.
 
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.
 
oder warum auch nur #!/bin/cat funzt, obwohl es nicht in etc/shells eingetragen ist
 
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
 
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)
 
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?
 
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