2012-11-10 2 views
9

Ich habe F # 2.0 mit Mono installiert, und ich möchte ./ meine F # Skripte. Welche Shebang-Zeile sollte ich für Mac OS X verwenden? Kann diese Shebang-Linie für Mac OS X und Linux verallgemeinert werden?Welchen Shebang sollte ich für F # Skripte in Mac OS X verwenden?

+0

Ich denke, das kann problematisch sein, da '#' kein Kommentar in F # ist - Sie könnten besser ein einfaches Bash-Skript schreiben. Wenn du über kompilierte Skripte sprichst, gibt es für Linux einen Kernel-Patch, um '. /' Arbeiten zu lassen - nicht sicher über mac –

+2

@JohnPalmer Ja, das Fehlen von '#' Kommentaren in F # und anderen Sprachen macht Shebangs schwieriger, obwohl nicht unmöglich. http://rosettacode.org/wiki/Multiline_Shebang – mcandre

+0

das ist ziemlich ordentlich - Sie könnten ein ganzes Bash-Skript dort verstecken, das Ihnen erlauben könnte, Portabilität Zeug zu tun –

Antwort

7

So in der Antwort des @ mcandre, es funktioniert, weil most shells revert to bourne shell wenn sie keine shebang finden.

Also mit #light, die beide gültig ist F # und ein Kommentar in Bourne Shell ermöglicht jeder Skriptumgebung zu sehen, was es versteht.

Das Skript im Inneren könnte jedoch verbessert werden. Wenn wir ein Skript ausführen, das --quiet zu --exec hinzufügt, scheint es überflüssig, wir erwarten auch, dass alle Argumente an das Skript übergeben werden. Eine idealere Version wäre exec fsharpi --exec $0 $*, also würden alle Argumente so übergeben, als ob Sie den Befehl explizit ausgeführt hätten.

#light ist nicht die einzige vorangegangene Direktive in F # . Präprozessordefinitionen würden auch funktionieren und könnten intuitiv sein, was vor sich geht. Das Einfügen eines Shell-Skripts zwischen #if run_with_bin_sh und #endif wäre für f # unsichtbar, da run_with_bin_sh nicht definiert wäre.

Beispiel FSX:

#if run_with_bin_sh 
    exec fsharpi --exec $0 $* 
#endif 
printfn "%A" fsi.CommandLineArgs 

Update: Echt shebang Unterstützung wie #!/usr/bin/env fsharpi --exec wurde in den official Microsoft F# code base hinzuzufügen. Es sollte also mit zukünftigen Versionen von F # funktionieren.

Update 2:#!/usr/bin/env fsharpi --exec funktioniert gut für Mac, aber nicht auf Linux. Linux muss #!/usr/bin/fsharpi --exec sein the incompatibilty is annoying.

Wenn Sie eine Cross-Plattform fsharp Shebang wollen. Folgendes wird funktionieren.

#!/bin/sh 
#if run_with_bin_sh 
    exec fsharpi --exec $0 $* 
#endif 
+1

'/ bin/usr/env' ??? das sieht falsch aus, ist das ein Tippfehler? Ich denke, du meinst '/ usr/bin/env' – knocte

+0

@knocte danke! – jbtule

10

In Mac OS X ist das Programm fsharpi.

hello.fs:

#light (* 
    exec fsharpi --exec $0 --quiet 
*) 

System.Console.WriteLine "Hello World" 
+0

Dies ist buchstäblich nirgendwo dokumentiert! Vielen Dank. – Noldorin

+0

Ich ging davon aus, dass das OP nach F # -Skripten (Erweiterung .fsx) fragte, nicht nach F # -Dateien (Erweiterung .fs) – knocte