标准输入/出与重定向

标准输入、输出、错误
文件描述符

每个进程会默认打开3个文件描述符:

STDIN_FILENO:值为0,代表标准输出流

STDOUT_FILENO:值为1,代表标准输入流

STDERR_FILENO:值为2,代表标准错误流

 

设备文件

标准输入文件:stdin,是指向键盘缓冲区的文件指针

标准输出文件:stdout,是指向屏幕显示区的文件指针

标准错误文件:stderr,是指向屏幕显示区的文件指针

  通过这两个指针封装了键盘和屏幕I/O操作的底层实现细节,从标准输入读取就是读取 /dev/stdin 的文件内容,输出到标准输出就是写入 /dev/stdout 文件。但实际上 /dev/stdin 和 /dev/stdout 并不是真实的文件,而是链接文件,它们连接到其他文件(默认是键盘缓冲区文件和屏幕缓冲区文件)。

  可以看见stdout和stderr都是指向屏幕,那为什么还要分成stdout 和 stderr 呢?这是因为通常在 server 的工作环境下,几乎所有的程序都是 run 在 background 的,所以为了方便 debug,一般在设计程序时,就把stdout 送到/存到一个档案(即重定向),把错误的信息 stderr 存到不同的档案。

 

 

重定向

  C库提供的一些标准I/O函数操作的是文件描述符,即标准输入流、输出流、错误流,而不是键盘的设备文件或屏幕的设备文件。通常标准输入流对应着键盘的标准文件,标准输出流和错误流对应屏幕的标准文件,但是当使用重定向后改变标准输入、输出、错误流对应的文件后,这些标准I/O函数读取的输入或输出的对象就不再是键盘或屏幕,而是重定向的文件。

Linux中的重定向符是 <>,例如:

  test.sh > test.log 指令会把test.sh脚本的标准输出重定向到文件test.log,也就是原本打印到终端的输出内容被打印到test.log文件中。但是,如果 test.sh 脚本中有语法错误或者其他,那么错误信息作为标准错位仍然会被打印到终端中。

  想要把错误信息和标准输出一起打印到 test.log 文件的话,需要使用 test.sh > test.log 2>&1 ,其中 2>&1 是把这个进程中的标准错误重定向到标准输出,然后就能和标准输出一起被打印到test.log文件中。

  注意,2>&12>1不一样,后者是把标准错误重定向到名为 1 的文件,而不是标准输出。

 

command > file 2>file 与 command > file 2>&1 的区别

  直观上二者的作用都是把标准错误和标准输出都重定向到文件 file 中,但是实际作用有所区别。前者是把stder和stdout分别送到file中,file相当于被打开两次,这样stderr和stdout的内容会互相覆盖,相当于使用FD1和FD2两个同时抢占file的管道。而后者是将stderr和stdout以同一个管道送往file,file只被打开一次。并且后者效率更高。

 

重定向到 /dev/null

  /dev/null是一个无底洞,输入到其中的内容会直接消失,并且它是个只读文件。通常有不想要的垃圾信息可以扔进 /dev/null。

  >/dev/null 2>&1 的作用是把标准错误和标准错误都重定向到 /dev/null 中,没有文件描述符时默认是 1,即标准错误重定向到标准输出,而标准输出重定向到了 /dev/null,所以脚本执行时不输出任何信息到终端。

  cat /dev/null > file 的作用是清除文件 file 的内容。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值