我试图使用 diff 命令来比较在 bash 中运行良好的目录列表:
diff <(cd alpha ; find . -type f) <(cd beta; find . -type f)
但是,在灰烬(没有其他外壳可用的嵌入式设备)上,我得到了
-ash: syntax error: unexpected "("
关于读取输入运算符<
或括号有什么区别(
)
吗?
不要将尖括号<( … )
与重定向中的尖括号混淆,例如cat < file
. 在 bash 中,<( echo hi )
实际上是一个内容为“hi”的文件(至少用于阅读目的)。所以你可以做
$ cat < <( echo hi )
hi
你也可以做
$ echo <( : )
/dev/fd/63
而shell实际上将该进程替换扩展为一个文件名。
进程替换是 bash 功能。它不是POSIX 规范的一部分,也不存在于像 ash 这样的 shell 中。另一方面,重定向是 POSIX。
<(command)
语法是Process Substitution,并且不受ash
shell(和其他受限/等 shell)的支持。
我发现这是最紧凑和最容易理解的解决方案:
#!/bin/sh
diff /dev/fd/3 3<<-EOF /dev/fd/4 4<<-EOF
$(sort file1)
EOF
$(sort file2)
EOF