在Bash中如何将文件与echo输出拼接后通过标准输入传递给可执行程序
在Bash中如何将文件与echo输出拼接后通过标准输入传递给可执行程序
看起来你是要把多个来源的内容(文件内容+手动插入的标识字符串)按顺序拼起来,通过标准输入传给那个只能读stdin的C++程序对吧?之前试的命令没得到预期结果,主要是没摸透cat命令的小细节,我来给你理清楚。
首先说核心问题:你之前写的cat < file1.txt <(echo "EOF") file2.txt | ./file之所以只输出了EOF和output,是因为cat的运行规则——只要给它传了文件名参数(比如这里的<(echo "EOF")和file2.txt),它就会直接读这些文件,完全忽略通过重定向(< file1.txt)传给它的标准输入内容,所以file1.txt的内容根本没被读进去!
那正确的写法有两种,都能完美满足你的需求:
方法一:直接用cat按顺序读取所有输入源(简洁写法)
直接把file1.txt作为cat的参数,和后面的匿名管道、file2.txt排在一起,这样cat就会按顺序读取这三个"文件"的内容并合并:
cat file1.txt <(echo "EOF") file2.txt | ./file
运行这个命令后,你的./file程序就会输出:
input EOF output
方法二:用命令分组直观拼接(新手友好)
如果你觉得匿名管道的写法有点绕,用括号把几个命令分组也是一样的效果——括号里的命令会在子shell中执行,它们的标准输出会被合并成一个流,再通过管道传给./file:
( cat file1.txt; echo "EOF"; cat file2.txt ) | ./file
这个写法逻辑更直白:先输出file1.txt的内容,再输出EOF字符串,最后输出file2.txt的内容,三者无缝拼接成一个输入流。
另外如果需要处理特殊字符(比如复杂转义字符),用printf代替echo会更可靠,比如:
( cat file1.txt; printf "EOF\n"; cat file2.txt ) | ./file
这样调整后,你的C++程序就能完整读到所有内容,输出你想要的结果啦~
备注:内容来源于stack exchange,提问作者fghoussen
相关产品推荐
相关产品推荐

