能否通过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
相关产品推荐
相关产品推荐

