我应该在Mac OS X中使用哪个shebang用于F#脚本?

时间:2012-11-10 05:43:45

标签: f# shebang

我在Mono上安装了F#2.0,我想./我的F#脚本。我应该在Mac OS X上使用哪个shebang系列?这个shebang系列能否适用于Mac OS X Linux?

3 个答案:

答案 0 :(得分:9)

在Mac OS X中,程序为fsharpi

hello.fs:

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

System.Console.WriteLine "Hello World"

答案 1 :(得分:8)

所以,在@ mcandre的回答中,它起作用的原因是most shells revert to bourne shell当他们找不到一个shebang时。

因此,#light有效F#和bourne shell中的注释允许每个脚本环境看到它理解的内容。

然而内部的脚本可以改进。当我们执行一个脚本时,将--quiet添加到--exec似乎是多余的,我们也希望所有参数都传递给脚本。更理想的版本是exec fsharpi --exec $0 $*,因此所有参数都将被传递,就像您明确地运行命令一样。

#light不是F#中唯一的#前置指令。预处理器定义也可以工作,并且可以直观地了解正在发生的事情。在#if run_with_bin_sh#endif之间放置一个shell脚本对于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等真正的shebang支持已添加到official Microsoft F# code base。所以它应该适用于F#的未来版本。

更新2: #!/usr/bin/env fsharpi --exec适用于mac,但不适用于Linux。 Linux需要#!/usr/bin/fsharpi --exec the incompatibilty is annoying.

如果你想要一个跨平台fsharp shebang。以下将有效。

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

答案 2 :(得分:0)

安装了最新的跨平台.net以及最新的linux(coreutil 8.30 <=)和bsd / mac os版本。您可以将以下shebang用于F#.fsx脚本。

#!/usr/bin/env -S dotnet fsi