以下是我的解释:
strings *.bin > bin.txt | sort -n bin.txt > logs1.txt
给了我logs1.txt
,但它有621 KB。strings *.bin > bin.txt & sort -n bin.txt > logs1.txt
给了我logs1.txt
,但是它有0 KB。strings *.bin > bin.txt
sort -n bin.txt > logs2.txt
这些命令提供了586,853 KB的文件logs2.txt
。注意,bin.txt
大小为586,853 KB,这意味着只运行3个选项就可以给出与bin.txt
相同的大小,我想知道原因。
发布于 2022-06-17 06:10:36
这个答案中的一些细节假设用户使用的是zsh
以外的shell。由于zsh
的原因,它的MULTIOS
功能的详细信息略有不同。
strings *.bin > bin.txt | sort -n bin.txt > logs1.txt
运行strings *.bin
并将结果重定向到bin.txt
。在strings
启动的同时,启动sort
并对文件bin.txt
进行排序。管道除了允许这两个命令并发运行之外,在这个管道中完全没有任何功能。通常,管道用于将左侧命令的标准输出传递到右侧命令的标准输入,但由于这两个命令都是从文件中读取的,所以从不使用管道。由于strings
和sort
都是同时启动的,sort
可能会在strings
完成整个文件编写之前找到bin.txt
文件的结尾。如果有的话,sort
将读取多少数据,这是相当随机的。正确使用管道看起来就像字符串--在这里,*.bin收排序-n > logs1.txt,strings
直接写入sort
的输入,而不是文件,sort
从strings
的输出而不是从文件中读取。如果左手侧不能产生足够快的数据,则管道的右侧将被暂时阻塞;如果右侧不能足够快地消耗数据,则左侧将被暂时阻塞。这样,这两个实用程序是同步的,您可以保证sort
将读取strings
的全部输出。strings *.bin > bin.txt & sort -n bin.txt > logs1.txt
的问题与前面的命令相同,因为strings
和sort
都是同时启动的。&
在后台启动strings
,然后立即启动sort
。这两个实用程序都是相互独立地写入或从bin.txt
读取的,这很有可能决定在sort
结束之前写入了多少文件。strings *.bin > bin.txt
其次为sort -n bin.txt > logs2.txt
。在这里,通过允许strings
在使用sort
对其内容排序之前完成对中间文件bin.txt
的写入,手动同步这两个实用程序。没有问题,您可以保证sort
将能够从文件中读取strings
的完整输出。汇总:前两个命令不同步strings
和sort
实用程序。strings
的写作与sort
的阅读无关。这意味着sort
可能在strings
完成编写所有数据之前找到中间文件的结尾。反过来,这意味着你可能得到一个不完整的结果。不完整结果包含的数据量取决于偶然。
这两个实用程序是同时启动的,这也意味着sort
甚至可以在shell有时间截断文件并启动strings
之前将预先存在的bin.txt
读取到末尾。
解决方案:首先将所有数据写入中间文件,然后从中间文件中读取数据,如第三个示例所示。或者,允许这两个实用程序使用管道在它们之间直接通信数据,如我上面的建议所示:
strings -- *.bin | sort -n > logs1.txt
或保留未排序的strings
输出的副本,以供以后参考:
strings -- *.bin | tee bin.txt | sort -n > logs1.txt
关于U&L的进一步相关解读:
https://unix.stackexchange.com/questions/706497
复制相似问题