使用 _< 而不是 < 用于使用 bash 的标准输入

使用 _< 而不是 < 用于使用 bash 的标准输入

使用进程替换时, 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 ,并且会根据上下文执行不同的操作。

我建议在重定向之前添加一个空格以使事情更清晰。我在中放置了一些关于良好重定向样式的指南本文

相关内容