如何使用entr在保存Rust文件时自动编译运行及排查错误?
Hey,我来帮你搞定这个entr配合Rust自动编译运行的问题,还有你遇到的那个错误~
用entr自动编译运行Rust文件的正确方法
先解决你碰到的报错
你执行的命令ls test.rs | entr -c "rustc test.rs && ./test"报错entr: exec rustc test.rs && ./test: No such file or directory,核心原因是:entr默认会把整个引号里的内容当作单个可执行文件来查找,它不认识shell的&&语法——这个语法是需要shell(比如sh/bash)来解析执行命令链的。
解决办法很简单,把你的命令用sh -c或者bash -c包裹起来,让entr调用shell去处理命令链:
ls test.rs | entr -c sh -c "rustc test.rs && ./test"
如果你的系统默认shell是bash,也可以换成bash -c,效果是一样的。
更通用的写法(适配多文件/动态文件名)
如果你的项目有多个.rs文件,或者不想每次硬编码文件名,可以利用entr的$0变量——它会指代当前被监控的文件。这样不管你监控哪个.rs文件,都能自动编译并运行对应的可执行文件:
printf "%s\n" *.rs | entr -c sh -c "rustc $0 && ./${0%.rs}"
这里的${0%.rs}是shell的参数扩展,用来去掉文件名的.rs后缀,生成对应的可执行文件名称。
几个实用的进阶技巧
- 用
-r替代-c:如果你的Rust程序是长期运行的(比如web服务器),entr -r会先杀掉之前运行的进程,再执行新命令,避免旧进程占用端口或资源:ls test.rs | entr -r sh -c "rustc test.rs && ./test" - 配合Cargo项目:如果是用Cargo管理的Rust项目,直接监控src目录下的所有.rs文件,自动触发
cargo run:find src -name "*.rs" | entr -r cargo run - 更可靠的文件列表生成:有时候
ls处理带空格的文件名会出问题,用printf "%s\n" *.rs代替ls *.rs更稳妥:printf "%s\n" test.rs | entr -c sh -c "rustc $0 && ./${0%.rs}"
内容的提问来源于stack exchange,提问作者aksh1618
相关产品推荐
相关产品推荐

