虽然其他答案非常好,但我想要一个简单的方法来编译、缓存和运行独立脚本。我的理由是,如果我要分发依赖于Rust安装的脚本,我可能也不能依赖于某个第三方库被安装以便它被编译。
如果我要费心传递多个文件,我倒不如直接传递一个预编译的二进制文件。如果我的脚本/程序用例足够复杂,那么我可能会通过标准的过程在git仓库中进行。
因此,对于只依赖于Rust和标准库的单个文件,请使用像以下这样的
hello.rs
文件:
#!/bin/sh
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() > 1 {
println!("Hello {}!", &args[1]);
} else {
println!("Hello world!");
}
}
为了更好地理解shebang的作用,请尝试使用以下代码。它实现了相同的功能,但更易于维护:
#!/bin/sh
//bin/bash -exc 'source_file="$0"; exe_file="${source_file%.*}"; [ "$source_file" -nt "$exe_file" ] && rustc "$source_file" -o "$exe_file"; "$exe_file" "$@"' "$0" "$@"; exit $?
这个解决方案基于wimh
的解决方案,但具有以下附加功能:
- 在与脚本相同的目录中缓存编译后的脚本,也适用于将脚本目录添加到路径中的情况。
- 将脚本的命令行参数传递给程序。
- 脚本的退出代码与程序或编译器的退出代码相同。
注意:shebang脚本依赖于脚本文件具有某种文件后缀,例如.rs
或.sh
。否则,编译器会抱怨要用生成的可执行文件覆盖脚本文件。
我的测试显示,与直接运行编译后的程序相比,该脚本增加了约10毫秒的开销。
编辑:正在进行RFC以添加类似Scriptisto的解决方案到Rust核心,以便以标准方式解决OP的问题。