使用 _< 而不是 < 对于使用 bash 的 stdin

JZe*_*lla 4 bash stdin

使用进程替换时 using_<<for stdin 有什么区别。这是使用 bash 完成的。

例子:

read bytes _< <(du -bcm random_iso.iso | tail -1); echo $bytes
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 15

那不是_<运算符,而是_传递给 read 和<重定向运算符的参数。<(cmd)本身是进程替换(扩展为指向管道的文件名)。

它的作用是运行:

read bytes _  < /proc/self/fd/x
Run Code Online (Sandbox Code Playgroud)

其中 fd x 是管道的读取端。

在管道的另一端(写入),一个后台子shell 进程正在执行du -bcm random_iso.iso | tail -1,其标准输出重定向到该管道。

所以read将把$bytes输出的最后一行的第一个单词存储在变量中du -bcm,并将该行的其余部分存储在$_变量中。

现在我不知道这du -bcm有什么意义。没有一个-b-c也没有-m选项是标准的。虽然-c是很常见的,是给予累计大小,GNU du-b是获得以字节为单位的文件大小(不磁盘使用情况),同时-m是让大小四舍五入到下一个mebibyte所以他们将冲突的选项(但也许他们用于-b其启用的副作用--apparent-size)。FreeBSD du 有-m(对于 mebibytes),没有-b,Solaris 也没有......

看起来它的意思是一种令人费解的写作方式:

wc -c < random_iso.iso
Run Code Online (Sandbox Code Playgroud)

或者:

du --apparent-size -cm random_iso.iso | awk 'END{print $1}'
Run Code Online (Sandbox Code Playgroud)

如果他们确实希望在 GNU 系统上将文件大小四舍五入到下一个兆字节。