如何将标准错误(或标准输出+标准错误)重定向到文件中,如果不知道哪个 shell(bash、csh、dash)在解析命令?
我的 C 代码在 Linux/FreeBSD/OSX 上运行,需要通过 system() 函数调用外部程序,该程序会使用 /bin/sh 来解析提供的命令行。我想捕获该外部程序打印的标准错误消息并保存到文件中。问题是,在不同的系统上 /bin/sh 指向不同的 shell,这些 shell 有不同的语法来将标准错误流重定向到文件中。
我找到的最接近的东西是,bash 实际上可以理解 csh 风格的语法来将标准错误+标准输出重定向到文件中:
我的 C 代码在 Linux/FreeBSD/OSX 上运行,需要通过 system() 函数调用外部程序,该程序会使用 /bin/sh 来解析提供的命令行。我想捕获该外部程序打印的标准错误消息并保存到文件中。问题是,在不同的系统上 /bin/sh 指向不同的 shell,这些 shell 有不同的语法来将标准错误流重定向到文件中。
我找到的最接近的东西是,bash 实际上可以理解 csh 风格的语法来将标准错误+标准输出重定向到文件中:
some_program >& output.txt
但是,在Ubuntu上(即非常常见的情况下)默认shell为dash
,它不理解这种语法。
是否有一种语法可以正确地被所有常见的shell解释用于stderr
重定向?或者,是否有一种方法可以告诉system()
(或其他类似的C函数)使用/usr/bin/env bash
来解释提供的命令行,而不是使用/bin/sh
?
/bin/sh
不能指向csh
,因此我应该使用POSIX(类似于bash
)的重定向语法解决了问题!感谢大家提供详细的答案! - Kirill Sokolovskysystem("some_program > output.txt 2>&1");
具有期望的效果,而system("some_program 2>&1 > output.txt");
则无法将stderr重定向到文件。 - Kirill Sokolovskycsh
的特定问题。我的问题是关于一种可移植的方法来重定向stderr
,而正确的答案确实是使用类似于bash
的语法并忘记csh
。 - Kirill Sokolovsky>output 2>&1
就相当于fd1="output.txt"; fd2=fd1
,而2>&1 >output
则是fd2=fd1; fd1="output.txt"
。在 C 中,你不会被a = "foo"; b = a
和b = a; a = "foo"
之间的区别搞混吧?;-) - user10678532