如何获取通过screen的stuff命令发送指令后返回的输出?
screen -X stuff 命令本身仅负责将字符注入目标screen会话的输入缓冲区,无任何返回内容,所以你用命令替换$()捕获到的内容必然为空。
方案1:继续使用screen捕获输出
操作步骤如下:
- 发送指令时统一用
\r作为换行符,适配不同终端的换行识别逻辑:screen -S accounts_hash -X stuff "total$(printf '\r')" - 等待程序执行完成(根据你的程序响应速度加延迟,一般0.1秒足够):
sleep 0.1 - 导出当前screen会话的屏幕内容到临时文件:
screen -S accounts_hash -X hardcopy /tmp/accounts_hash_output.tmp - 读取临时文件内容过滤目标输出即可,用完可直接删除临时文件。
方案2:更优的后台REPL交互方案
你之前直接写/proc/PID/fd/0无效的原因是大部分REPL程序仅在伪终端(PTY)环境下才会按行解析输入,直接写入普通文件描述符不会触发程序的输入解析逻辑。推荐以下替代方案:
- 可修改程序的最优方案:给Rust程序新增Unix域套接字(UDS)监听能力,程序启动时监听本地套接字文件(如
/run/accounts_hash.sock),外部程序直接向套接字发送指令、接收返回结果,无中间层损耗,稳定性最高,Rust标准库和第三方异步runtime都有成熟的UDS实现。 - 无需改程序的轻量方案:用
socat为程序绑定一个伪终端,启动命令如下:
后续直接向socat PTY,link=/tmp/accounts_repl,raw,echo=0 EXEC:/path/to/your/rust/program/tmp/accounts_repl写入指令,读取该文件即可拿到输出,无需依赖screen/tmux这类终端多路复用器。 - 习惯用终端多路复用器的替代方案:用tmux代替screen,捕获输出无需写临时文件,发指令后直接执行:
即可将当前会话的所有内容输出到标准输出,直接用管道过滤即可拿到目标结果。tmux capture-pane -pt accounts_hash
内容的提问来源于stack exchange,提问作者Evan Schwartzentruber
相关产品推荐
相关产品推荐

