
1.4.4 作为脚本运行
前面介绍了如何将Kotlin代码编译成字节码,创建jar文件,然后使用java或kotlin命令运行代码。当一个大型应用程序中有多个文件时,这个两步过程非常有用。但并不是我们写的所有东西都是大型或企业级的——shell脚本和批处理文件有自己的位置。
要执行一些后端任务、解析一些文件、根据某些配置复制文件——换句话说,对于通常使用shell脚本的情况,可以使用Kotlin编写脚本。这样做的好处是,你不必记住sh、zsh、bash、Windows CMD、PowerShell等shell命令,可以使用一种强大而流畅的语言来完成任务。一旦在Kotlin中实现了所需的任务,就可以将其作为脚本来运行,只需一步,而不用显式地编译代码来创建字节码。
如果代码有语法错误,那么脚本的执行将会失败,实际上也不会运行脚本的任何部分。所以作为脚本来运行与编译并执行它一样安全。
让我们编写一个Kotlin脚本来列出当前目录中所有扩展名为kts的文件。以下是代码:

该文件的内容与你编写的常规Kotlin文件没有任何不同。唯一的区别是文件名,即kts扩展名而不是kt扩展名,表示打算作为脚本来运行。
代码使用了来自JDK java.io包的File类,还使用了Kotlin添加到该类的扩展函数。它遍历当前(.)目录中的所有文件,只筛选或挑选以kts扩展名结尾的文件,并打印文件对象,即所挑选的每个文件的完整路径和名称。
要运行这个文件,我们将使用kotlinc-jvm命令,但是这一次不进行编译,而是要求工具立即以脚本的形式运行代码。为此,使用-script选项,如下所示:

下面是这段代码的输出:

在类Unix系统上,如果你想运行脚本而不使用前缀kotlinc-jvm-script,那么可以使用shebang(符号#!)功能,如下所示:

确保运行chmod+x greet.kts为文件赋予执行权限。
然后,直接从命令行运行文件,如下所示:

这将产生输出:

在某些系统上,你必须提供kotlinc-jvm位置的完整路径,而不是/usr/bin/env,这样shebang功能才能正常工作。
如果你打算在生产环境中使用脚本,你可能会发现kscript[1]很有用。它是一个库,提供了一些使用Kotlin脚本的功能,包括编译后的脚本缓存。
Kotlin代码不仅可以编译成Java字节码,还可以编译成其他几种格式,我们将在下面看到。
[1] https://github.com/holgerbrandl/kscript