答案1
它将字符串转换为其所代表的 bash 脚本输出的文件描述符。这可能令人困惑,下面是一个例子
如果你输入echo <(ls)
它将打开一个新的文件描述符,其名称将被替换。因此命令可能会变成说echo /dev/fd/63
。
需要文件的程序现在可以读取命令的输出,而不必接受标准输入。
$ my_program ls
Error: 'ls': No such file or directory.
$ my_program <(ls)
my_program was called with the argument /dev/fd/63
bin dev etc ...
如果没有提供输入源,许多 Linux 程序都会等待标准输入。由于可以使用“|”运算符将标准输出通过管道传输到标准输入,因此您可以使用 say ls | grep hello
。这只能起作用,因为 grep 无论如何都会等待输入,如果它期望打开并读取文件名以获取其数据,则管道运算符不起作用。这就是您需要 <(...) 的原因。
我希望这是可以理解的。:-)
与 < 运算符一起将文件的输出重定向到程序对 stdin 的读取,这使得以下内容意义:
Bash:从此文件读取输出,该文件是根据此命令的输出创建的。
澄清:
- 标准输入:一个“文件”(不是真的,但在 Linux 中一切都像文件一样),当读取时,它会神奇地包含你输入的内容
- 标准输出:一个“文件”,写入后将打印到虚拟终端
- 运算符(即
<
或<()
):与常规数学相同,运算符和操作数的表达式将被评估和替换。3+2*3 变成 5*3 变成 15。在 Bash 语言中也是如此。
强调罗杰观点的一个很好的例子是这样的表达:
if [ -f my_condition ] then something fi
这里括号中的内容将被评估为条件语句,即如果 my_condition 为真,则执行某些操作。但:[
实际上只是程序的别名test
,当使用参数 -f 调用时,它将检查文件是否存在。
答案2
为了澄清 Stefano 的观点,第二个 < 不仅仅是一个 <,它实际上是 <()
您可能已经熟悉类似的构造 $(),它生成一个字符串,该字符串是其中命令的结果。因此:
$ which bash # echo the path to bash
/bin/bash
$ ldd $(which bash) # return which libraries bash is linked to
...
字符串替换后,这相当于
ldd /bin/bash
正如 Stefano 所说,<() 做了非常相似的事情,但是返回的是一个文件描述符。
您可以在 中找到 bash 文档man bash
。由于它是一个很大的手册页,您可以搜索(按/
)<\(
(您需要退出左括号 - 搜索<(
不起作用)。