You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过SML/NJ运行Bash Shell命令?希望在SML脚本中执行diff fileA fileB

在SML/NJ中执行Bash Shell命令的方法

绝对可以!SML/NJ的标准库里提供了处理外部进程的工具,能轻松实现你想要的执行diff fileA fileB这类Shell命令的需求,下面给你具体的实现方式:

1. 基础执行:获取命令退出状态

最直接的方式是使用OS.Process模块的system函数,它会运行你传入的Shell命令,并返回进程的退出状态:

open OS.Process;

(* 运行diff命令 *)
val exitStatus = system "diff fileA fileB";

(* 根据状态判断结果 *)
case exitStatus of
    success => print "两个文件内容完全一致\n"
  | failure => print "文件存在差异,或者命令执行出错(比如文件不存在)\n";

这里要提一句:diff命令的退出码有特殊逻辑——返回0表示文件相同,返回1表示文件有差异,返回2及以上才是真正的错误。但OS.Process.system会把所有非0的退出码都统一返回为failure,所以如果需要精确区分“有差异”和“执行出错”,你得结合输出重定向来进一步判断。

2. 捕获命令的输出内容

如果需要拿到diff命令输出的具体差异内容,system函数没法直接捕获输出,这时候可以通过Shell的重定向功能,把命令的输出写入临时文件,再读取这个文件的内容:

open OS.Process;
open TextIO;
open OS.FileSys;

(* 将diff的标准输出和错误输出都重定向到临时文件 *)
val _ = system "diff fileA fileB > diff_output.txt 2>&1";

(* 写个小工具函数读取文件内容 *)
fun readFile filePath =
    let val inputStream = openIn filePath
        val content = inputAll inputStream
    in closeIn inputStream; content end;

(* 获取diff的输出结果 *)
val diffResult = readFile "diff_output.txt";

(* 输出结果,或者做你需要的处理 *)
print ("Diff命令的输出:\n" ^ diffResult ^ "\n");

(* 用完临时文件记得删掉 *)
val _ = remove "diff_output.txt";

这种方式虽然需要临时文件中转,但在SML/NJ里是最稳定的捕获外部命令输出的方案。

内容的提问来源于stack exchange,提问作者Tai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:55:32