【问题标题】:Bash double process substitution gives bad file descriptorBash 双进程替换给出了错误的文件描述符
【发布时间】:2012-09-22 09:23:21
【问题描述】:

当我尝试在 bash 函数中引用两个进程替换管道时,只有引用的第一个有效。第二个给出一个“错误的文件描述符”错误,如下所示:

$ foo(){
> cat "$1"
> cat "$2"
> }
$ foo <(echo hi) <(echo bye)
hi
cat: /dev/fd/62: Bad file descriptor
$ 

似乎一旦引用了第二个管道,就会删除第二个管道,但是 a) 我似乎无法在任何文档中确认此行为,并且 b) 我希望它不会。 =)

关于我做错了什么有什么想法吗? FWIW 我这样做是为了制作一个包装器来使用 Mac OS X 的 FileMerge 图形差异工具,而不是命令行工具,它已经很高兴从命令行处理多个管道。

-罗伯

【问题讨论】:

    标签: bash process pipe file-descriptor substitution


    【解决方案1】:

    你确定你是用 bash 而不是其他 shell 运行它吗?你检查echo $SHELL的输出了吗?

    使用 bash 对我来说效果很好:

    [16:03:51][tim@tim(1)]:~
    (0)$function foo() { cat "$1"; cat "$2"; };
    [16:03:59][tim@tim(1)]:~
    (0)$foo <(echo "lva") <(echo hi)
    lva
    hi
    

    例如,当我将 shebang 更改为 #!/bin/dash 时出现错误。

    请尝试将 #!/bin/bash 作为 shebang 放在脚本的第一行。

    【讨论】:

    • 这不是一个答案……我刚刚检查过——它在 linux 上工作,在 osx 上失败,这似乎是 OP 的平台。
    【解决方案2】:

    随 OSX (3.2.48) 提供的 /bin/bash 在这方面失败了。来自 macports 的那个(4.2.37——通常是/opt/local/bin/bash,如果你安装了它)工作正常。无论是版本还是构建我不知道。也许您可能想为这个脚本使用 macports bash。当然,每台 Mac 上都必须有 macport,所以我假设你有 ;-)

    【讨论】:

    • 是的,macports bash 为我修复了它。我将更新我的终端登录。谢谢!
    【解决方案3】:

    首先,我认为@Michael Krelin 认为这与 OS X (v3.2.48) 提供的 bash 版本有关是正确的。从我的测试来看,文件描述符在函数执行的第一个外部命令之后被丢弃:

    $ bar() { echo "Args: $*"; echo "First ext command:"; ls /dev/fd; echo "Second ext command:"; ls /dev/fd; }
    $ bar <(echo hi) <(echo bye)
    Args: /dev/fd/63 /dev/fd/62
    First ext command:
    0   1   2   3   4   5   6   62  63
    Second ext command:
    0   1   2   3   4   5   6
    

    请注意 /dev/fd/62 和 63 在两个 ls 列表之间消失。不过,我想我找到了一种解决方法:在脆弱的 fd 有机会消失之前将它们复制到非脆弱的 fd:

    $ baz() { exec 3<"$1" 4<"$2"; ls /dev/fd; ls /dev/fd; cat /dev/fd/3; cat /dev/fd/4; }
    $ baz <(echo hi) <(echo bye)
    0   1   2   3   4   5   6   62  63
    0   1   2   3   4   5   6
    hi
    bye
    

    【讨论】:

    • 很棒的解决方法。是的,很抱歉没有指定,但奇怪的行为是在 OS X 10.8 上。我注意到在 cygwin 中也没有发生这种奇怪的行为。如果“正确”工作,我可能会切换到 macports bash。
    【解决方案4】:

    这看起来像这里的问题:http://bugs.alpinelinux.org/issues/1465

    【讨论】:

      猜你喜欢
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多