Linux/macOS下如何将P的stdout直接传递给仅读取文件的C程序?
无需临时磁盘文件实现生产者输出到仅支持文件读取的消费者
核心解决方案:进程替换(推荐)
在Linux和macOS的bash/zsh等现代shell中,进程替换是最简便的方案,它会自动创建临时管道类文件描述符,让消费者程序误以为读取的是普通文件,但实际数据仅在内存中流转,不会写入磁盘。
语法格式:
./C -f <(P)
结合你的实际场景(1Password CLI + kinit),具体命令示例:
kinit -kt <(op read op://your-vault/your-keytab-item) your-user@YOUR-REALM.COM
原理说明
<(P) 会触发shell创建临时FIFO或/dev/fd下的文件描述符,将生产者P的输出导向该描述符,同时把描述符路径传给消费者C。整个过程无磁盘写入,命令执行完成后shell会自动清理临时资源,无需手动操作。
备选方案:手动创建命名管道(FIFO)
若你的shell不支持进程替换(极少情况),可手动创建命名管道:
- 创建临时FIFO:
mkfifo /tmp/keytab-fifo - 后台运行生产者,将输出写入FIFO:
op read op://your-vault/your-keytab-item > /tmp/keytab-fifo & - 运行消费者读取FIFO:
kinit -kt /tmp/keytab-fifo your-user@YOUR-REALM.COM - 执行完成后删除FIFO(可选,FIFO本身不存储数据):
rm /tmp/keytab-fifo
注意事项
- 命名管道仅作为数据传输通道,不会将数据持久化到磁盘;
- 需确保生产者先启动写入,再运行消费者(或用子shell同步执行);
- 若消费者需多次读取文件内容,管道机制可能不适用(管道数据读取一次后即消失),但kinit读取keytab仅需一次,完全适配。
内容的提问来源于stack exchange,提问作者stuyguy
相关产品推荐
相关产品推荐

