【问题标题】:Difference on bash and ash parenthesesbash 和 ash 括号的区别
【发布时间】:2015-06-11 13:18:56
【问题描述】:

我试图使用 diff 命令来比较在 bash 中运行良好的目录列表:

diff  <(cd alpha ; find . -type f) <(cd beta; find . -type f)

但是,在灰烬(没有其他外壳可用的嵌入式设备)上,我得到了

-ash: syntax error: unexpected "("

读取输入运算符&lt;或括号()有什么区别吗?

【问题讨论】:

  • 是的。 ash 不支持 bash 支持的进程替换。这就是&lt;(command) 语法。
  • 另外,无论如何,这并不总是能可靠地工作。到目前为止,您显然很幸运。 find 不保证以任何特定顺序返回文件列表,并且顺序可能会随着文件的添加/删除/修改/等而改变。您可以通过在每个find 之后添加| sort 来解决这个问题,不过,我猜...

标签: linux bash shell unix ash


【解决方案1】:

不要将&lt;( … ) 中的尖括号与cat &lt; file 等重定向中的尖括号混淆。在 bash 中,&lt;( echo hi ) 实际上是一个内容为“hi”的文件(至少用于阅读目的)。所以你可以做

$ cat < <( echo hi )
hi

你也可以这样做

$ echo <( : )
/dev/fd/63

而 shell 实际上将该进程替换扩展为文件名。

Process substitution 是一个 bash 功能。它不是POSIX specification 的一部分,也不存在于像灰烬这样的贝壳中。另一方面,Redirection 是 POSIX。

【讨论】:

    【解决方案2】:

    &lt;(command) 语法为 Process Substitution,不受 ash shell(和其他受限/等 shell)的支持。

    【讨论】:

    • 如果您需要进程替换,ash 中的替代方案是什么?喜欢使用tee的能力吗?
    【解决方案3】:

    我发现这是最简洁易懂的解决方案:

    #!/bin/sh
    diff /dev/fd/3 3<<-EOF /dev/fd/4 4<<-EOF
    $(sort file1)
    EOF
    $(sort file2)
    EOF
    

    参考:https://unix.stackexchange.com/a/639752/137528

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 2012-09-27
      • 1970-01-01
      • 2013-08-16
      • 2019-02-22
      • 2022-11-19
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多