我相信大家不论在编程语言,python脚本,shell脚本编写,到处都能见到这两个语句吧~~,一直是模模糊糊,懵懵懂懂。我今天就上网浏览了一番,特来做一下笔记。
标准输出(stdout)
指的就是在命令行里,每次你输入指令后,终端上打印出来的那些话,那些反馈。标准错误(stderr)
跟标准输出差不多,只不过是程序出错时反馈的内容。标准输入(stdin)
就是程序指示让你输入用户名密码之类的这种,这里不多谈输入。比如python中的print('helloworld')、c++中的cout << "helloworld" << endl;shell脚本中的echo语句,都是标准输出。
问题是,我们很常用的会让一些脚本自己在后台24/7运行,这种时候脚本的输出内容到屏幕上(标准输出)也没什么意义,我们看不到也保存不了。所以最好让它把反馈的内容全部直接写如一个文件里,我们叫日志文件,其实就是个txt。然后我们自己可以查看日志来看到底发生了什么。
这种把显示到屏幕的程序反馈,变成存到文件里的动作,我们叫做输出重定向(stdout redirection)
在命令行里,我们可以用符号直接把程序输出转向
到某个文件或某个程序,如下:
$ git push > log.txt
然后,理论上我们平常git push
后的反馈就会保存到log.txt
这个文件里了,且屏幕上不会显示任何东西。
但其实这个还是有问题的,因为事后我们发现有一些存到了log.txt,还有一些话漏网显示到了屏幕上,没存进去文档里。
其实原来这些显示到屏幕上的反馈有些是stdout
有些是stderr
,我们用>
或>>
符号重定向,只是默认重定向stdout
,没有重定向stderr
,所以会有漏网之鱼。对此,我们需要了解下这个符号的设定,和怎么把stderr
也包括进来,一起重定向过去。
重定向符号和语句
稍微会一点点linux命令的,都会用到cmd > file
这样的语句,把命令反馈的输出到一个文件里。当然还有cmd >> file
,这是把内容追加到文件里,而不是重新擦写一遍。>
这个符号可以念redirect to
。
实际上,重定向有很多种设置和配合,让你可以分别重定向标准输出和标准错误,或者一起重定向,然后还可以选择是只输出到文件里还是同时输出到显示屏上和文件里。
这里我们就要了解一下设置重定向的基本语法了,如下:
>
以擦写的模式重定向至...>>
以追加的模式重定向至...1
代表stdout
标准输出2
代表stderr
标准错误
所以,cmd > file
实际上是缩略了的写法,理解起来,应该是cmd &1> file
,也就是只把标准输出转出去(重定向到文件)。
那么同理,只把标准错误转出去,就应该是cmd &2> file
。
其中,&
符号没任何实际意义,只是以至区分,代表后面的符号是要设置重定向用的,而不是某个文件的名字。文章末尾单独补充下&符号的作用
2>&1
每次查重定向问题时,我们总会看到这句话,一般人很难理解这到底是在干嘛。我一开始以为是2要大于1什么的,真是笑话。
其实这是个重定向的设置,设置让2重定向到1,也就是让stderr
标准错误重定向到stdout
标准输出,然后两个并在一起再重定向。其中&
没什么意思只是区分开来1是代表stdout
而不是代表一个文件名。
用起来的格式是:cmd > file 2>&1
。
为什么设置要放在后面呢?
具体暂时还不知道,只知道是这么用,放在前面还不行只能放在后面。
比如:
$ git push > log.txt 2>&1
那么这时候,屏幕上就真的不会显示任何东西了,标准输出、标准错误,全部都会存到log.txt文件里了。
重定向符号>与&号:
1>&2 正确返回值传递给2输出通道 &2表示2输出通道,如果此处错写成 1>2, 就表示把1输出重定向到文件2中.。
2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道. 而不是一个文件。
>是重定向符,就是把前面输出的内容重定向到后面指定的位置
echo
"一些内容"
> filename.txt
>前是可以加数字来说明把什么内容重定向到文件中,默认是把标准输出重定向到文件中,所以下面这个例子和上面那个是一样的(例2):
echo
"一些内容"
1> filename.txt
& 是一个描述符,如果1或2前不加&,会被当成一个普通文件。
1>&2 意思是把标准输出重定向到标准错误.
2>&1 意思是把标准错误输出重定向到标准输出。
&>filename 意思是把标准输出和标准错误输出都重定向到文件filename中