gpt4 book ai didi

linux - shell重定向位置之间的区别

转载 作者:IT王子 更新时间:2023-10-29 01:26:07 24 4
gpt4 key购买 nike

这两行之间有什么区别吗?

for i in $(seq 1 10); do echo $i - `date`; sleep 1; done >> /tmp/output.txt

for i in $(seq 1 10); do echo $i - `date` >> /tmp/output.txt ; sleep 1; done

因为 Robert told me第一个只在 for 循环之外进行 I/O OP。

但是,如果我输入 tail -f/tmp/output.txt,它的行为方式完全相同。

最佳答案

如果他们成功了,他们也会这样做。但是,如果它们因任何原因失败,可能会有显着差异。

第一个:

for ...; do
# things
done >> file

这将在循环完成后重定向到文件。但是,只要 Bash 决定刷新缓冲区,它就可能发生。

想象一下在第 3 次迭代后出现故障:您无法判断文件中存储了哪些内容。

第二个:

for ...; do
# things >> file
done

这将在每次迭代时重定向到文件。

想象一下在第 3 次迭代后出现问题:您确定前两个循环已正确存储在文件中。

来自 How to redirect output from an infinite-loop program :

If your program is using the standard output functions (e.g. puts, printf and friends from stdio.h in C, cout << … in C++, print in many high-level languages), then its output is buffered: characters accumulate in a memory zone which is called a buffer; when there's too much data in the buffer, the contents of the buffer is printed (it's “flushed”) and the buffer becomes empty (ready to be filled again). If your program doesn't produce much output, it may not have filled its buffer yet.

此外,来自 the answer you link :

Placing the redirection operator outside the loop doubles the performance when writing 500000 lines (on my system).

这是有道理的:如果你必须在每个循环中刷新,这比让 Bash 在它觉得方便的时候刷新要花费更多的时间。一次写五行比一次写一行容易。

关于linux - shell重定向位置之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34494348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com