【问题标题】:Bourne shell: how to redirect to multiple-digit fd?Bourne shell:如何重定向到多位 fd?
【发布时间】:2017-01-18 18:10:13
【问题描述】:

在一个 C 程序中,我有一个文件描述符(实际示例:14,但程序当然事先不知道这一点)打开以供写入。我希望调用system(3) 来运行某些东西并将其标准输出发送到这个文件描述符。当然,这调用了/bin/sh,它是Bourne shell,它不能识别1>&14 形式的结构。是否有替代语法(可能使用大括号或其他东西)可以让 Bourne shell 看到 14 并使用它?我当然可以做其中之一:

  1. 使用 fork/exec 组合而不是 system(3) 并手动重定向。

  2. 将输出重定向到一个文件,然后将其中的数据复制到文件描述符 14。

  3. 因为我有 root,所以让/bin/sh 指向 Bash。

最优雅的方法是发现 Bourne shell 接受多位数文件描述符编号的语法。有这样的吗?

【问题讨论】:

  • 我确定ksh93 的较新版本支持多位文件描述符。我很确定您将它们称为1>{14} 等。所以zshbash 似乎也有这个功能。正如您所问的“..也许使用大括号”,也许您应该尝试一下? 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


【解决方案1】:

考虑一下我最喜欢的优化规则:(1) 不要优化。 (2) 专家:尚未优化。

问题中出现的情况(对我而言)将出现在每天最多执行 100 次的代码中。所以这就足够了:

sprintf(big_string,
        "bash -c \"somethingsomething 1>&%d\"",
        the_fd
       );

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 2012-03-09
    • 2012-05-21
    • 2010-11-14
    • 2011-01-13
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多