2012-11-10 27 views
9

我用F#2.0安裝了Mono,我想用我的F#腳本./。我應該在Mac OS X中使用哪條shebang線?這個shebang行可以通用於Mac OS X Linux嗎?哪個shebang應該用於Mac OS X中的F#腳本?

+0

我認爲這可能會有問題,因爲'#'不是F#中的註釋 - 您可能會更好地編寫一個簡單的bash腳本。如果你在談論編譯腳本,對於Linux有一個內核補丁,使'/'工作 - 不知道有關的Mac –

+2

@JohnPalmer是,缺乏對F#'#'註釋和其他語言,使shebangs更加困難,儘管並非不可能。 http://rosettacode.org/wiki/Multiline_shebang – mcandre

+0

那是相當整齊 - 你可以有隱藏整個bash腳本這可能讓你做的東西便攜 –

回答

7

所以,在@ mcandre的答案,它的工作原理是因爲most shells revert to bourne shell時,他們沒有找到一個家當。

因此,有#light這既是有效的F#和Bourne shell的評論允許每個腳本環境,看看它理解。

但是裏面的腳本可以改進。當我們執行一個腳本時,添加--quiet--exec似乎是多餘的,我們也希望所有參數都傳遞給腳本。更理想的版本將是exec fsharpi --exec $0 $*,因此所有參數都將被傳遞,就像顯式地運行命令一樣。

#light不是F#的唯一#之前指令。預處理器定義也可以工作,並且可以直觀地瞭解正在發生的事情。將一個shell腳本放在#if run_with_bin_sh#endif之間會對f#不可見,因爲run_with_bin_sh不會被定義。

例FSX:

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

更新:真實家當支持諸如#!/usr/bin/env fsharpi --exec已經加入到official Microsoft F# code base。所以它應該適用於未來版本的F#。

更新2:#!/usr/bin/env fsharpi --exec適用於mac,但不適用於linux。 Linux需要是#!/usr/bin/fsharpi --execthe incompatibilty is annoying.

如果你想要一個跨平臺的fsharp shebang。以下將起作用。

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

'/ bin/usr/env' ???那看起來錯了,是一個錯字?我想你的意思是'/ usr/bin/env' – knocte

+0

@knocte謝謝! – jbtule

10

在Mac OS X中,程序是fsharpi

hello.fs:

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

System.Console.WriteLine "Hello World" 
+0

這是從字面上無形的記錄!謝謝。 – Noldorin

+0

我假設OP在詢問F#腳本(.fsx擴展名),而不是F#文件(.fs擴展名) – knocte