有没有一种方法可以将stderr重定向到可以在bash,csh和dash中工作的文件?

Kir*_*sky 4 c bash csh

如何重定向stderr(或stdout+ stderr)到一个文件,如果我不知道是哪个壳(bashcshdash)是解释我的命令?

我在Linux / FreeBSD / OSX上运行的C代码需要通过system()函数调用外部程序,该函数将用于/bin/sh解释提供的命令行。我想捕获该外部程序打印到的消息stderr,并将其保存到文件中。问题在于,在不同的系统上/bin/sh指向具有不同语法的不同shell,这些语法用于将stderr流重定向到文件。

我发现的最接近的东西是bash实际上了解cshstderr+ 重定向stdout到文件的-style语法:

some_program >& output.txt
Run Code Online (Sandbox Code Playgroud)

但是dash,这是Ubuntu上的默认外壳程序(即非常常见),无法理解该语法。

是否有stderr所有通用shell都能正确解释的重定向语法?或者,有没有办法告诉system()(或其他一些类似的C函数)使用/usr/bin/env bash而不是/bin/sh解释所提供的命令行?

R..*_*R.. 6

您有一个错误的假设,那就是/bin/sh可能是“替代” shell,例如csh,它与标准shell语法不兼容。如果您具有这样的系统设置,它将无法使用;没有shell脚本会起作用。几乎所有的现代系统尝试符合,至少在表面上,POSIX标准,其中所述sh命令处理Shell命令语言在POSIX指定,这大致相当于历史Bourne shell和其中bashdashash等。(弹其是通常安装为/bin/sh)都与99.9%兼容。

您可以完全忽略csh和类似。它们从未安装为sh,只有真正想要使用它们的人,或者是因为使用某些邪恶的sysadmin设置登录shell默认方式而被卡住作为交互式shell的人,才需要关心它们。