Linux标准I/O和重定向

执行一个shell命令时,通常会自动打开三个标准文件,即标准输入文件(stdin),文件描述符为0,通常对应终端的键盘;标准输出文件(stdout),文件描述符为1和标准错误输出文件(stderr),文件描述符为2,这两个文件都对应终端的屏幕。

标准I/O和重定向

$ ls,命令行读取执行键盘敲击的文本流“ls\n”,得到结果a.txt。这时结果会输出到屏幕上,显示出来。如果你不想让文本流流到屏幕,而是流到另一个文件,可以采用重新定向的机制。例如:
$ ls >b.txt,执行后屏幕上并没有显示结果,而在b.txt文件中可以看到输出的结果。这种重定向每次会重写覆盖b.txt中的内容,如果你不想覆盖已有的内容,而是将结果添加到文件的末尾,就使用$ ls >> b.txt命令。
上面这些命令都是将标准输出重定向到某个地方,但是如果出现标准错误,结果仍然会流到屏幕上。例如,cd到一个不存在的目录,如果使用cd test > c.txt命令,屏幕上会显示标准错误。那么怎样将标准错误也重定向到某一地方呢,可以使用下面命令。
cd test >& c.txt,执行后错误信息就会被导入到c.txt文件中。

易混淆的地方

2>1,表示将标准错误重定向到文件1中,2>&1,表示将标准错误重定向到标准输出中。这两个符号放到命令结束处。假如你启动某个go程序,希望将运行的结果都保存在nohup.out文件中。
$ go run main.go 2>&1 | tee -a nohup.out,其中tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin,简单的说就是把数据重定向到给定文件和屏幕上。
注意:此命令存在缓存机制,每1024个字节将输出一次,若从管道接收输入数据,缓冲区满,才将数据转存到指定的文件中。

参考文章

  1. Linux文本流和标准输入、标准输出、标准错误与重定向介绍
  2. Linux脚本之>/dev/null 2>&1,以及2>1 VS 2>&1

你可能感兴趣的:(linux)