使用进程替换时, using_<
和for stdin有什么区别。<
这是使用 bash 完成的。
例子:
read bytes _< <(du -bcm random_iso.iso | tail -1); echo $bytes
答案1
这不是一个_<
运算符,而是_
传递给 read 和<
重定向运算符的参数。<(cmd)
本身就是进程替换(扩展为指向管道的文件名)。
其作用是运行:
read bytes _ < /proc/self/fd/x
其中 fd x 是管道的读取端。
在管道的另一(写入)端,后台子 shell 进程正在执行,du -bcm random_iso.iso | tail -1
其标准输出重定向到该管道。
因此,read
会将$bytes
输出的最后一行的第一个字存储在变量中du -bcm
,并将该行的其余部分存储在$_
变量中。
现在我不知道这du -bcm
有什么意义。-b
、-c
和选项都不-m
是标准的。 while-c
很常见,用于给出累积大小,对于 GNU du
,-b
是获取以字节为单位的文件大小(而不是磁盘使用情况),而 while-m
是将大小四舍五入到下一个兆字节,因此它们会是冲突的选项(尽管可能他们使用-b
其启用的副作用--apparent-size
)。 FreeBSD du 有-m
(兆字节),没有-b
,Solaris 两者都没有......
看起来这是一种复杂的写法:
wc -c < random_iso.iso
或者:
du --apparent-size -cm random_iso.iso | awk 'END{print $1}'
如果他们确实希望在 GNU 系统上将文件大小四舍五入到下一个兆字节。
答案2
如前所述,_<
这不是重定向。这将_
作为最终参数传递给read
.然后将其<
解释为单独的重定向运算符,将进程替换的输出重定向到标准输入。
_
在 Bash 脚本中,与内置变量一起用作“一次性变量”已成为惯例read
。在 bash 中,_
是一个特殊变量,在执行每个命令后,它被设置为命令的最后一个参数。在这种情况下,这意味着bytes
将分配第一个字段,并将剩余字段丢弃到变量中_
,而不是将所有剩余字段分配到bytes
。
虽然这是一种惯例,但有很多充分的理由避免_
以这种方式滥用。
_
POSIX 未指定此行为。大多数 shell 不会用它做任何特别的事情。- 在
zsh
,中_
有该readonly
属性,使用该属性将导致 shell 抛出错误。 - 在 中
mksh
,_
只有交互模式下的 bash 行为。在非交互式脚本中,_
用于不同的目的,并且在每个命令之后不会分配任何内容。 - in
ksh93
,_
仅设置为一行中最后一个命令的最后一个参数。命令必须在物理上位于单独的代码行上才能使用_
.此外,_
在 ksh93 中,它被重载以在各种上下文中具有许多其他用途,因此_
不建议为此目的分配 to ,并且会根据上下文执行不同的操作。
我建议在重定向之前添加一个空格以使事情更清晰。我在中放置了一些关于良好重定向样式的指南本文。