are not allowed on UNIX.
Damn.
Um das klarer zu machen: Ich will ein Skript schreiben, bei dem oben im shebang) hartcodiert ein Pfad zum interpreter steht.
So weit so gut. ABER. Dieser Interpreter liegt in einem Verzeichnis - und dieses Verzeichnis hat ein Leerzeichen im Namen.
Doh.
Die Regeln sagen nämlich:
The initial line of a script file must begin with #! as the
first two bytes, followed by zero or more spaces, followed by
interpreter or interpreter argument. One or more spaces or tabs
must separate interpreter and argument. The first line should
end with either a new-line or null character.
Und da hält sich auch der Mac OS X Kernel genau daran.
Ich bin auch nicht der erste der darĂĽber gestolpert ist. Hallo Felix. :-)
Das Blöde daran: Die Implementierungen erlauben weder ein Escapen, noch ein "In Anführungszeichen Setzen" des Interpreters.
Hrmpf.
Nach einigem Nachdenken sind mir letztlich nur zwei Lösungsmöglichkeiten aufgefallen:
1) Das Programm in zwei Dateien aufsplitten - die erste startet mit /bin/sh im shebang und dann ganz normal im 'body' den normalen Interpreter mit den normalen Mitteln der Shell (die auch quotes und escapen erlauben).
2) Wenn das Programm ein File bleiben soll / muss, kann ein Polyglot) das Problem lösen.
Das sah bei mir dann so aus:
#!/bin/sh
# Solves the problem that shebang lines can't contain spaces
# (even escaped or quoted) in the interpreter path via a polyglot
"""false"
exec /Users/dwt/Archiv/Code/Aktive\ Projekte/Trac/env-trac-0.11/bin/python $0 $@
"""
import sys
print sys.argv
Das funktioniert so:
- wird die Datei gestartet, wird sie mit der Bourne Shell (oder einer der Nachkommen) ausgefĂĽhrt
- in der Zeile
"""false"
maskiere ich mit Hilfe des Kommandos "false" den Beginn eines Python Doc-Strings / Kommentars / Multiline-Strings.
- Danach wird mit "exec" die Datei nochmal ausgefĂĽhrt - diesmal mit dem richtigen Interpreter.
- Der ĂĽberspringt diesen Teil dann weil fĂĽr ihn der Start komplett im Kommentar / ... / ... verschwindet.
Einerseits finde ich es cool das ich diesen Workaround gefunden habe - andererseits ist das natĂĽrlich ein totaler Hack. Insofern bin ich eher dagegen.
Was ich jetzt damit Tue weiĂź ich jedenfalls noch nicht.