如何在GNU Guile中捕获system函数调用的标准输出?
用Guile的
system函数获取命令输出 system函数本身的设计就只返回命令的退出状态,没有内置捕获标准输出的功能。要拿到输出,只能借助shell的重定向技巧配合文件读取来实现,以下是两种可行方案:
方案1:固定临时文件存储输出
把命令的标准输出重定向到临时文件,之后读取文件内容:;; 执行ls并把输出写入临时文件 (define exit-status (system "ls > /tmp/ls-output.tmp")) ;; 读取临时文件里的输出内容 (define ls-output (call-with-input-file "/tmp/ls-output.tmp" get-string-all)) ;; 用完可以删掉临时文件 (system "rm /tmp/ls-output.tmp")这样
ls-output就存了ls的标准输出,exit-status保留原有的命令退出状态。方案2:动态生成临时文件避免冲突
用mktemp生成唯一的临时文件名,防止多进程同时运行时的文件冲突:;; 生成临时文件名并捕获其输出 (define temp-file (string-trim (with-output-to-string (lambda () (system "mktemp"))))) ;; 执行ls并输出到临时文件 (define exit-status (system (string-append "ls > " temp-file))) ;; 读取输出内容 (define ls-output (call-with-input-file temp-file get-string-all)) ;; 删除临时文件 (system (string-append "rm " temp-file))
需要注意:这两种方式本质都是通过shell重定向把输出转存到文件,再读取文件——因为system本身没有提供直接获取子进程输出的API,它的核心逻辑就是让子进程共享当前进程的IO流,仅返回退出码。
内容的提问来源于stack exchange,提问作者Rovanion
相关产品推荐
相关产品推荐

