以前经常听到这几个词,还有标准输入,完全不知道。直到最近需要将python脚本中的打印内容打印到日志文件中,才开始研究这是什么东西。原来,标准输出(stdout)指的是每次在命令行输入命令时打印在终端上的文字和反馈。标准错误(stderr)类似于标准输出,但它是程序出错时反馈的内容。标准输入(stdin)就是程序让你输入用户名和密码的那种,这里就不说输入了。问题是我们经常让一些脚本24/7在后台运行。这时候脚本的输出在屏幕上是没有意义的(标准输出),我们看不到也保存不了。所以最好让它把所有的反馈内容直接写入一个文件。我们称之为日志文件,其实就是一个txt。然后我们可以自己检查日志,看看发生了什么。这种将程序反馈显示在屏幕上的操作称为输出重定向(stdoutredirection)。在命令行中,我们可以使用符号将程序输出直接重定向到文件或程序中,如下所示:$gitpush>log.txt那么,理论上我们平时gitpush后的反馈都会保存在日志中。txt文件,屏幕上不会显示任何内容。但其实这样还是有问题的,因为后来我们发现log.txt里面保存了一些单词,还有一些单词从网上溜了出来显示在了屏幕上,但是并没有保存在文档中。事实上,屏幕上显示的反馈有的是stdout,有的是stderr。我们使用>或者>>符号来重定向,但是stdout默认是重定向的,而stderr是不重定向的,所以会有漏网之鱼。对此,我们需要了解这个符号的设置,以及如何将stderr包含进来,并一起重定向。重定向符号和语句有点熟悉Linux命令,会使用cmd>file等语句将命令反馈输出到文件中。当然还有cmd>>file,就是把内容追加到文件中,而不是重新写一遍。>这个符号可以被读取重定向到。其实重定向有很多设置和配合,可以让你把标准输出和标准错误分别重定向,或者一起重定向,然后你可以选择只输出到文件还是输出到大屏,文件在同一时间。这里我们要了解设置重定向的基本语法,如下:>redirectto...inerasemode>>Redirectto...inappendmode1代表stdoutstandardoutput2代表stderrstandarderror因此,cmd>file其实是一种缩写的写法。理解一下,应该是cmd&1>文件,也就是只把标准输出调出来。同理,如果只传标准错误,应该是cmd&2>文件。其中&符号没有实际意义,只是一种区分,意思是后面的符号是用来设置重定向的,不是某个文件的名字。2>&1我们每次查找重定向问题,总会看到这句话。普通人很难理解它在做什么。我一开始以为2大于1什么的,开什么玩笑。其实这是一个重定向设置。设置为redirect2to1,即把stderr标准错误重定向到stdout标准输出,然后将两者一起重定向。其中&的意思无非是为了区别1代表stdout而不是代表文件名。使用的格式是:cmd>file2>&1。为什么设置放在后面?具体我还不知道,只知道是这么用的。如果不能放在前面,就只能放在后面。例如:$gitpush>log.txt2>&1那么这个时候,屏幕上真的什么都不会显示,标准输出和标准错误都会存储在log.txt文件中。常用于重定向及解释参考文章:stackoverflow回复command>output.txt标准输出流将仅重定向到文件,在终端中不可见。如果文件已经存在,它将被覆盖。命令>>output.txt标准输出流将仅重定向到该文件,它在终端中是不可见的。如果文件已经存在,新数据将附加到文件的末尾。command2>output.txt标准错误流将仅重定向到文件,它在终端中是不可见的。如果文件已经存在,它会被覆盖。command2>>output.txt标准错误流将被重定向到文件,它在终端中是不可见的。如果文件已经存在,新数据将附加到文件的末尾。command&>output.txt标准输出和标准错误流都将仅重定向到文件,终端中不会显示任何内容。如果文件已经存在,它将被覆盖。command&>>output.txt标准输出和标准错误流都将被重定向到该文件,终端中将看不到任何内容。如果文件已经存在,新数据将附加到文件的末尾..command|teeoutput.txt标准输出流将被复制到文件中,它在终端中仍然可见。如果文件已经存在,它将被覆盖。tee-aoutput.txt标准输出流将被复制到文件中,它在终端中仍然可见。如果文件已经存在,新数据将附加到文件的末尾。(*)Bash没有允许仅将StdErr传递给第二个命令的速记语法,这里需要再次与tee结合使用以完成桌子。如果您确实需要类似的东西,请查看“如何通过管道传输stderr而不是stdout?”在StackOverflow上了解一些方法这可以做到,例如通过交换流或使用processsubstitution.command|&teeoutput.txt标准输出和标准错误流都将被复制到文件中,同时在终端中仍然可见。如果文件已经存在,它将被覆盖。command|&tee-aoutput.txt标准输出和标准错误流都将被复制到文件中,同时在终端中仍然可见。如果文件已经存在,新数据将附加到文件末尾。
