为何C++程序中无法执行Unix重定向操作?
问题原因分析
这个问题的核心在于**system()函数调用的shell和你平时在终端用的shell不一样**:
- 你在Ubuntu终端直接执行命令时,默认使用的是
bash,它支持&>这种扩展语法(一次性重定向标准输出和标准错误到同一个文件)。 - 但C++的
system()函数,在Linux系统下默认调用的是/bin/sh——而Ubuntu里的/bin/sh其实是dash的软链接,dash是一个遵循POSIX标准的轻量shell,它不支持&>这种bash专属的扩展语法。
当你在system()里写ls &> A.txt时,dash会把&>和A.txt当成ls命令的普通参数,相当于执行了ls "&>" "A.txt"。因为当前目录下没有名为&>和A.txt的文件(如果之前没创建的话),ls就会把错误信息和空的列表输出到控制台,自然不会有内容写入A.txt。
两种解决办法
方法1:使用POSIX标准的重定向语法
POSIX标准中,同时重定向stdout和stderr的写法是command > file 2>&1,这个语法所有符合POSIX的shell(包括dash)都支持。修改你的代码如下:
#include <cstdlib> int main() { system("ls > A.txt 2>&1;"); return 0; }
方法2:显式指定用bash执行命令
如果你想继续使用&>这种便捷的bash语法,可以让system()调用bash来执行命令,写法是bash -c "你的命令":
#include <cstdlib> int main() { system("bash -c \"ls &> A.txt\""); return 0; }
注意这里的双引号需要转义(\"),因为C++字符串里的双引号必须转义才能被正确解析。
内容的提问来源于stack exchange,提问作者SmallChess
相关产品推荐
相关产品推荐

