我已经用 Mono 安装了 F# 2.0,我想要./
我的 F# 脚本。我应该为 Mac OS X 使用哪条 shebang 线?这条 shebang 线可以推广到 Mac OS X和Linux 吗?
3 回答
注意 fsharpi
已被 取代dotnet fsi
。看到这个答案。
在 Mac OS X 中,程序是fsharpi
.
你好.fs:
#light (*
exec fsharpi --exec $0 --quiet
*)
System.Console.WriteLine "Hello World"
因此,在@mcandre 的回答中,它之所以有效,是因为大多数 shell在找不到 shebang 时会恢复为 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
更新:真正的 shebang 支持,如#!/usr/bin/env fsharpi --exec
已添加到官方 Microsoft 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
安装了最新的跨平台 .net 和最新的 linux (coreutil 8.30 <=) 和 bsd / mac os 版本。您可以将以下 shebang 用于 F#.fsx
脚本。
#!/usr/bin/env -S dotnet fsi