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

mca*_*dre 10 f# shebang

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

mca*_*dre 9

在Mac OS X中,程序是fsharpi.

hello.fs:

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

System.Console.WriteLine "Hello World"
Run Code Online (Sandbox Code Playgroud)


jbt*_*ule 8

所以,在@ mcandre的回答中,它的作用是因为大多数shell在找不到shebang时会恢复到bourne shell.

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

但是内部的脚本可以改进.当我们执行一个脚本文件,添加--quiet--exec似乎是多余的,也是我们希望所有参数传递给脚本.一个更理想的版本将是exec fsharpi --exec $0 $*所有参数将被传递,就像您显式运行命令一样.

#light不是#F#中唯一的先前指令.预处理器定义也可以工作,并且可以直观地了解正在发生的事情.将shell脚本放在f#之间#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
Run Code Online (Sandbox Code Playgroud)

更新:真正的shebang支持,如#!/usr/bin/env fsharpi --exec已加入官方微软F#代码库.所以它应该适用于未来版本的F#.

更新2: #!/usr/bin/env fsharpi --exec适用于mac,但不适用于Linux.Linux需要#!/usr/bin/fsharpi --exec 不兼容是烦人的.

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

#!/bin/sh
#if run_with_bin_sh
  exec fsharpi --exec $0 $*
#endif
Run Code Online (Sandbox Code Playgroud)


jbt*_*ule 6

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

#!/usr/bin/env -S dotnet fsi
Run Code Online (Sandbox Code Playgroud)