【发布时间】:2017-01-18 18:10:13
【问题描述】:
在一个 C 程序中,我有一个文件描述符(实际示例:14,但程序当然事先不知道这一点)打开以供写入。我希望调用system(3) 来运行某些东西并将其标准输出发送到这个文件描述符。当然,这调用了/bin/sh,它是Bourne shell,它不能识别1>&14 形式的结构。是否有替代语法(可能使用大括号或其他东西)可以让 Bourne shell 看到 14 并使用它?我当然可以做其中之一:
使用
fork/exec组合而不是system(3)并手动重定向。将输出重定向到一个文件,然后将其中的数据复制到文件描述符 14。
因为我有 root,所以让
/bin/sh指向 Bash。
最优雅的方法是发现 Bourne shell 接受多位数文件描述符编号的语法。有这样的吗?
【问题讨论】:
-
我确定
ksh93的较新版本支持多位文件描述符。我很确定您将它们称为1>{14}等。所以zsh和bash似乎也有这个功能。正如您所问的“..也许使用大括号”,也许您应该尝试一下? Bourne Shell,绝对不是与原始 unix 系统相关的标准版本,但谁知道你会在与 Linux 相关的更现代版本中找到什么。 (是否有真正的适用于 Linux 的 Bourne Shell?)。祝你好运。 -
对于 bourne shell(我在 FreeBSD 中使用它;我从未在 Linux 中遇到过它),
1>&{14}失败并显示错误消息,1>{14}默默失败。 bash 使用1>&14。在 Linux(我从中迁移)上时,我使用 bash 作为我的/bin/sh。看起来在 FreeBSD 上我也会这样做。这是让我的遗留代码顺利运行的最简单方法。 -
好东西。感谢您的反馈/信息。听起来你已经决定了一个解决方案,很高兴你可以继续前进。祝大家好运!
-
... 除了我刚刚发现 bash 缺少 bourne shell 所具有的东西:
setvar命令。这会破坏启动 FreeBSD 时运行的基本 shell 脚本。所以它回到了绘图板上。也许最好的解决方案是创建一个名为 bash_system 的 C 函数,它就像system(3)一样,只是它调用 bash,而不是/bin/sh。
标签: sh output-redirect