Ruby: Shebang-Zeile

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Es könnte an etwas ganz banalem liegen: einem Steuerzeichen am Ende der ersten Zeile. Lösche die Shebang-Zeile mal komplett raus (inklusive Zeilenumbruch) und tippe sie neu ein. Klappt es dann?
 

ernesto

Boskoop
Registriert
14.04.07
Beiträge
41
Es hat sich zumindest etwas getan. Wenn ich nun

./ssp.rb test.ssp

eingebe, spuckts folgendes aus:

./ssp.rb:4:in `initialize': No such file or directory - test.ssp (Errno::ENOENT)
from ./ssp.rb:4:in `open'
from ./ssp.rb:4:in `seqopen'
from ./ssp.rb:105

Die Datei test.ssp ist aber im verzeichnis vorhanden. Der Anfang der Datei ssp.rb sieht nun so aus:

#!/usr/bin/env ruby
#
def seqopen

@file = File.open(ARGV[0])

end



def seqclose

@file.close

end

...
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Ohne Einblick in den Quellcode - insbesondere Zeile 4 - wird's schwierig...
 

ernesto

Boskoop
Registriert
14.04.07
Beiträge
41
Ja, dem stimme ich zu :)
Ich glaube zwar nicht, dass der Autor was dagegen hat, aber ich werde ihn lieber fragen, bevor ich den Quellcode poste. Das geschieht dann frühestens morgen.
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
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?
Das behaupte ich, ja. Jedenfalls nicht ohne weitere (nicht ratsame) Eingriffe.
Weil:
Code:
env - /usr/bin/sudo -u www /usr/bin/env apachectl configtest
...vermutlich nicht das ergibt, was du erwartest.
(Nur so als Beispiel...)
Kopfnuss?
Na, deshalb:
Code:
env - /usr/bin/sudo -u www /bin/bash -ic 'echo $PATH'
 

ernesto

Boskoop
Registriert
14.04.07
Beiträge
41
Hallo,
also ich darf den Code posten. Aber ich soll um Milde bitten, es sei sein erstes Ruby-Programm ;)
Natürlich sind Verbesserungsvorschläge willkommen.

Code:
#!/usr/bin/env ruby
#
def seqopen
	@file = File.open(ARGV[0])	
end

def seqclose
	@file.close
end	

def read_quadrant
	@quadrant = Array.new
	cnt = 0
	@maxx = 0
	@file.each_line do |line|
		next if line =~ /^#/
		@quadrant[cnt] = parse_line(line)
		if @quadrant[cnt].length > @maxx 
			@maxx = @quadrant[cnt].length
		end
		cnt = cnt + 1
	end
end

def parse_line(line)
	@elements = line.chomp.split(/\s*\|\s*/)
	return @elements
end

def make_grid
	dimy = 0.5 + @quadrant.length + 0.5
	dimx = 0.5 + @maxx + 0.5
	puts "\t % draw coordinate system"
	puts "\t \\draw [->] ( 0 , 0 ) -- ( 0 , #{dimy} );"
	puts "\t \\draw [->] ( 0 , 0 ) -- ( #{dimx} , 0 );"
end

def make_arrows
	x = 0
	y = 0
	@quadrant.reverse!
	@quadrant.each do |row|
		row.each do |elem|
			arrowgrad = @quadrant[y][x].scan(/\(\d\)/)
			if arrowgrad.to_s != ''
				@quadrant[y][x] = elem.sub(/\(\d\)/, '')
				grad = arrowgrad.to_s.scan(/\d/).to_s
				puts "\t \\draw [->] (#{x+1.23},#{y+0.73}) -- (#{x+0.75+grad.to_f},#{y+2.25-grad.to_f});"
			end
			x = x + 1
		end
		y = y + 1
		x = 0
	end
end

def make_entries
	x = 1
	y = 1
	puts "\t % Quadrant 1"
	#@quadrant.reverse!
	@quadrant.each do |row|
		puts "\t % begin row"
		row.each do |elem|
			puts "\t \\node at ( #{x} , #{y} ) [rectangle,fill=white] {$#{elem}$};"
			x = x + 1
		end
		y = y + 1
		x = 1
	end
end

def write_header
	puts "\\documentclass{article}"
	puts ""
	puts "% -- Package used for the graphics --"
	puts "\\usepackage{tikz}"
	puts ""
	puts "% -- Start of the main document --"
	puts "\\begin{document}"
	puts ""
end
	
def write_tikzstart
	puts ""
	puts "% -- start of the spectral sequence --"
	puts "\\begin{tikzpicture}"
	puts ""
end
	
def write_tikzend
	puts ""
	puts "\\end{tikzpicture}"
	puts "% -- end of the spectral sequence --"
	puts ""
end
	
def write_eof
	puts ""
	puts "\\end{document}"
	puts "% -- EOF --"
end


seqopen
write_header
write_tikzstart
read_quadrant
make_grid
make_arrows
make_entries
write_tikzend
write_eof
seqclose

Die Testdatei, die eingelesen werden soll, sieht so aus:

Code:
x (1)| y (2)| z 
a    |      | c | k
1    | 2    | 3 | b_1
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Irgendwie haben wir in diesem Thread jetzt zwei Themen...

@Rastafari:
Das behaupte ich, ja. Jedenfalls nicht ohne weitere (nicht ratsame) Eingriffe.
Ok. Um es nochmal zu wiederholen: Dein Punkt ist, dass Skripte, welche mit den Rechten eines Benutzers ohne Login-Shell laufen, in der Shebang-Zeile u.U. kein /usr/bin/env benutzen können? Zu diesem Zweck habe ich im CGI-Verzeichnis meines (unmodifizierten) Apache 1.3.33 unter Tiger mal das Testskript
Code:
#!/usr/bin/env perl
print "Content-type: text/html\n\n";
print "<html><body>Hello World!</body></html>\n";
abgelegt. Rechte und Eigentümer sehen wie folgt aus:
Code:
power-mac-g4:/Library/WebServer/CGI-Executables thorsten$ ls -l
total 8
-rwxr-xr-x   1 www  www  107 Nov  8 21:12 test.pl
Et voilà, das Skript funktioniert wie gewünscht:

bild1cf5.png


Und jetzt kommst Du... ;)

Aber ich glaube, bei ernesto geht es sowieso nur um ein Skript, das er von der Shell aus startet.


@ernesto: Probier es doch erst mal mit einem abgespeckten Dummy-Skript.
Code:
#!/usr/bin/env ruby
#
@file=File.open(ARGV[0])
@file.close

Funktioniert das bei Dir? Bei mir z.B. schon.
 

ernesto

Boskoop
Registriert
14.04.07
Beiträge
41
@quarx Ok, diesen dummy-skript habe ich unter "test.rb" abgespeichert, sowie eine Testdatei test.ssp, die eingelesen werden soll (sie sieht genau so aus wie oben, aber das sollte ja keine Rolle spielen?). Führe ich im Terminal den Befehl

./test.rb test.ssp

aus, so bekomme ich wieder die Fehlermeldung

./test.rb:3:in `initialize': No such file or directory - test.ssp (Errno::ENOENT)
from ./test.rb:3:in `open'
from ./test.rb:3

Benutze ich eigentlich die richtige Syntax, um test.ssp einzulesen?

Oder anders gefragt: wenn Du meinst "bei mir funktioniert das schon?", was genau funktioniert da, welche Befehle genau gibst Du im Terminal ein? Sorry, für die dummen Fragen, aber ich habe wirklich kein Hintergrundwissen darüber, wie das ganze funktioniert.
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Also ich bekomme mit dieser Datei test.rb
Code:
#!/usr/bin/env ruby
#
@file=File.open(ARGV[0])
@file.close
und einer beliebigen Datei test.ssp im gleichen Verzeichnis nach
Code:
./test.rb test.ssp
keinen Fehler. o_O

(Power Mac G4, OS X 10.4.10)
 

ernesto

Boskoop
Registriert
14.04.07
Beiträge
41
Ja, seltsam...
ich sitze an einem MacBook mit Leopard (vor kurzem über Tiger aufgespielt - bisher keine Probleme). Wenns am letzterem liegt, ja dann...
Ja, gute Frage. Vorschläge? o_O
 

ernesto

Boskoop
Registriert
14.04.07
Beiträge
41
Ha! es ist noch viel banaler als Du dachtest, quarx :) Da es ja nun an der Datei test.ssp liegen musste, habe ich sie mir genauer angeguckt. Aus irgendwelchen Gründen (ja, hauptsächlich meine Unachtsamkeit) wurde sie als test.ssp.txt gespeichert und der suffix ist nicht sichtbar. Nachdem das korrigiert war, läuft alles.

Vielen Dank für Deine Hilfe!