12

我已经用 Mono 安装了 F# 2.0,我想要./我的 F# 脚本。我应该为 Mac OS X 使用哪条 shebang 线?这条 shebang 线可以推广到 Mac OS XLinux 吗?

4

3 回答 3

8

注意 fsharpi已被 取代dotnet fsi。看到这个答案


在 Mac OS X 中,程序是fsharpi.

你好.fs:

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

System.Console.WriteLine "Hello World"
于 2012-11-10T06:06:30.593 回答
8

因此,在@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
于 2014-02-22T02:39:08.660 回答
5

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

#!/usr/bin/env -S dotnet fsi
于 2020-09-18T05:01:01.673 回答