2分钟搞懂输出重定向

描述

接着上节课的标准输出讲。

视频最后我们通过重定向把标准输出写到了文件中,但是错误输出还是留在了屏幕上。

 

root@turbo:~# ls
test  test.c
root@turbo:~# 
root@turbo:~# ./test 
xxxxxx 错误输出
------ 标准输出
root@turbo:~# 
root@turbo:~# ./test > out.log
xxxxxx 错误输出
root@turbo:~# 
root@turbo:~#
有没有什么方法把错误输出也写到文件里面?

重定向分为输入重定向输出重定向,输入重定向使用场景比较少,我们主要来讲讲输出重定向。

先把程序修改一下,只留下标准输出。
#include 


int main()
{
    //fprintf(stderr, "xxxxxx 错误输出
");


    fprintf(stdout, "------ 标准输出
");


    return 0;
}
运行程序的时候会在屏幕上打印字符串,如果希望把这些字符串收集起来,运行的时候加上输出符号和文件名,字符串就写到了文件里面。
root@turbo:~# gcc test.c -o test 
root@turbo:~# ./test > out.log
root@turbo:~#
一个符号表示清空文件重新写入,两个符号表示往文件的后面追加。

再把程序改回来,这次既有标准输出,也有错误输出:
#include 


int main()
{
    fprintf(stderr, "xxxxxx 错误输出
");


    fprintf(stdout, "------ 标准输出
");


    return 0;
}
代码的运行现象是这样的:
root@turbo:~# ls
test  test.c
root@turbo:~# ./test 
xxxxxx 错误输出
------ 标准输出
root@turbo:~#
如果像刚才一样加上重定向,那只能把标准输出写到文件中:
root@turbo:~# ls
test  test.c
root@turbo:~# ./test > out.log
xxxxxx 错误输出
root@turbo:~# 
root@turbo:~#
其实这种写法也等价于这样的:
root@turbo:~# ls
test  test.c
root@turbo:~# ./test 1> out.log
xxxxxx 错误输出
root@turbo:~# 
root@turbo:~#
0 1 2在 Linux 中分别表示标准输入、标准输出、标准错误处理,大部分时候我们会把1省略掉。

如果想把错误信息也收集到文件中,可以这样写:
root@turbo:~# ls
out.log  test  test.c
root@turbo:~# ./test 1> out.log 2> error.log
root@turbo:~#
意思也很明确,标准输出写到文件out.log中,错误输出写到文件error.log中。

这就是上节课说的,stdout和stderr可以把不同级别的信息分开。

如果想把标准输出和错误输出写到同一个文件中,可以使用这条命令:
root@turbo:~# ./test > out.log 2>&1
root@turbo:~#
 
2>&1
这个符号的意思就是把错误输出重定向到标准输出。

需要注意的是,此处的顺序不能修改,否则达不到想要的效果。

有的时候我们不想看到输出信息,也不想保存输出信息,可以考虑dev下的null设备文件,所有写进去的数据都会被丢弃。
root@turbo:~# ./test > /dev/null 2>&1
root@turbo:~#






审核编辑:刘清

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分