bash中stdout和stderr的顺序
为什么结果不是按以下顺序bash中stdout和stderr的顺序,bash,redirect,Bash,Redirect,为什么结果不是按以下顺序 ls test.mp4 test.sh 1>/tmp/text 2>&1 cat /tmp/text ls: cannot access test.sh: No such file or directory test.mp4 可能是1>/tmp/text先执行,test.mp4在test.sh之前定位。 结果是什么 stdout似乎在_出口处被缓冲和刷新。 另一方面,stderr则更为紧迫。我不认为bash会等到_退出才把它清除掉。如果它是
ls test.mp4 test.sh 1>/tmp/text 2>&1
cat /tmp/text
ls: cannot access test.sh: No such file or directory
test.mp4
可能是1>/tmp/text
先执行,test.mp4在test.sh之前定位。结果是什么 stdout似乎在_出口处被缓冲和刷新。
另一方面,stderr则更为紧迫。我不认为bash会等到_退出才把它清除掉。如果它是缓冲的。这与bash无关。它只是反映了C标准库I/O函数缓冲区输出的方式 这里有一个有用的摘录,摘自Linux系统上的
mansetvbuf
(解释主要来自C和Posix标准,但我认为在这个摘录中很容易找到和理解)。第二段是对你看到的行为的解释
可用的三种缓冲类型是无缓冲、块缓冲和行缓冲。当输出流未缓冲时,信息一经写入就显示在目标文件或终端上;当它被块缓冲时,许多字符被保存并作为块写入;当它是行缓冲字符保存起来,直到一个换行输出或输入读取任何流连接到终端设备(通常是标准输入)。功能fflush(3)可用于提前强制关闭挡块。(见fclose(3))
通常所有文件都是块缓冲的。如果一个流引用一个终端(如stdout通常所做的那样),那么它是行缓冲的。默认情况下,标准错误流stderr始终是无缓冲的
所以,概括一下stdout
通常指终端,因此是行缓冲的,但您已将其重定向到文件,因此它是块缓冲的。但是,stderr
始终是无缓冲的,无论它是否被重定向
因此,打印到stderr
的任何内容都会立即出现,而打印到stdout
的任何内容都将被保留,直到缓冲区填满(在Linux上,通常为8kb)
请注意,当ls
检测到stdout
不是终端时,它默认设置-1
标志(每行一个文件名)。否则,它将默认设置-x
标志(一行中可以容纳的文件名数量)。这意味着您将在终端上看到相同的反转,而无需任何重定向:
test.mp4
ls: cannot access test.sh: No such file or directory
$ ls good bad
ls: cannot access bad: No such file or directory
good