我在Mono上安装了F#2.0,我想要./
我的F#脚本.我应该在Mac OS X上使用哪个shebang系列?这个shebang系列能否适用于Mac OS X 和 Linux?
在Mac OS X中,程序是fsharpi
.
hello.fs:
#light (*
exec fsharpi --exec $0 --quiet
*)
System.Console.WriteLine "Hello World"
Run Code Online (Sandbox Code Playgroud)
所以,在@ 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)
安装了最新的跨平台 .net 以及最新的 linux (coreutil 8.30 <=) 和 bsd / mac os 版本。您可以将以下 shebang 用于 F#.fsx
脚本。
#!/usr/bin/env -S dotnet fsi
Run Code Online (Sandbox Code Playgroud)