Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash中stdout和stderr的顺序_Bash_Redirect - Fatal编程技术网

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