2012-11-10 12 views
9

Mam F # 2.0 zainstalowany z Mono, i chciałbym ./ moje skrypty F #. Jakiej linii powinienem używać Mac OS X? Czy ta wąska linia może zostać uogólniona dla systemów Mac OS X i Linux?Którego shebang powinienem użyć dla skryptów F # w Mac OS X?

+0

Myślę, że może to być problematyczne, ponieważ '#' nie jest komentarzem w języku F # - może lepiej napisać prosty skrypt bash. Jeśli mówisz o skompilowanych skryptach, dla Linux-a jest łatka jądra, która powoduje, że '. /' Działa - nie ma pewności co do mac –

+2

@JohnPalmer Tak, brak komentarzy '# 'w F # i innych językach sprawia, że ​​shebang są trudniejsze, choć nie niemożliwe. http://rosettacode.org/wiki/Multiline_shebang – mcandre

+0

który jest całkiem schludny - możesz ukryć tam cały skrypt bash, który może pozwolić ci na przenoszenie rzeczy przenośnych –

Odpowiedz

7

Więc w odpowiedzi @ mcandre jest, to działa, bo most shells revert to bourne shell gdy nie znaleźć shebang.

Posiadanie , które jest zarówno poprawnym F #, jak i komentarzem w powłoce bourne, pozwala każdemu środowisku skryptowemu zobaczyć, co rozumie.

Scenariusz wewnątrz można jednak poprawić. Kiedy wykonamy skrypt dodając --quiet do --exec wydaje się zbędny, również oczekujemy, że wszystkie argumenty zostaną przekazane do skryptu. Bardziej idealną wersją będzie exec fsharpi --exec $0 $*, więc wszystkie argumenty będą przekazane tak, jakbyś jednoznacznie uruchomił komendę.

#light to nie jedyna # poprzedzona dyrektywą w F #. Definicja preprocesora również zadziała i może być intuicyjna w stosunku do tego, co się dzieje. Umieszczenie skryptu powłoki między #if run_with_bin_sh i #endif będzie niewidoczne dla f #, ponieważ run_with_bin_sh nie zostanie zdefiniowane.

Przykład FSX:

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

zmiana: Prawdziwe wsparcie shebang takich jak #!/usr/bin/env fsharpi --exec było dodać do official Microsoft F# code base. Powinno więc działać z przyszłymi wersjami F #.

aktualizacja 2:#!/usr/bin/env fsharpi --exec działa świetnie na mac, ale nie na Linuksie. Linux musi być #!/usr/bin/fsharpi --execthe incompatibilty is annoying.

Jeśli chcesz mieć platformę fsharp na wielu platformach. Poniższe będą działać.

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

'/ bin/usr/env' ??? to wygląda źle, czy to literówka? Chyba miałeś na myśli '/ usr/bin/env' – knocte

+0

@knocte thanks! – jbtule

10

W systemie Mac OS X program to fsharpi.

hello.fs:

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

System.Console.WriteLine "Hello World" 
+0

To jest udokumentowane dosłownie nigdzie! Dziękuję Ci. – Noldorin

+0

Zakładałem, że OP pytał o skrypty F # (rozszerzenie .fsx), a nie F # (rozszerzenie .fs) – knocte