You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:12:15