bash中奇奇怪怪的文件重定向

良许Linux

共 2125字,需浏览 5分钟

 ·

2023-08-31 08:26


           


0x01 测试程序


本文会用以下测试程序,来演示在bash中,如何进行各种文件重定向:



上图是一段rust代码,其主要逻辑是,从标准输入读取数据,然后将这些数据分别写到标准输出和标准错误输出里。


有关什么是标准输入/输出/错误输出,请阅读我之前写的一篇文章:到底什么是标准输入输出


0x02 将标准输入重定向到 /dev/null



/dev/null 是linux下的一个特殊文件,从该文件读取数据时,内核会直接返回EOF,即读不到任何数据,所以在上图中,stdout/stderr行的输出都为空。


0x03 将标准输入重定向到普通文件



上图先用echo命令,把hello字符串写到stdin.log,然后执行测试程序,把它的标准输入重定向到stdin.log,此时stdout/stderr行就都输出了hello字符串。


0x04 将标准输出重定向到普通文件



上图把标准输出重定向到了stdout.log,所以终端只输出了stderr行,而stdout行被写到了stdout.log文件中。


0x05 将标准错误输出重定向到普通文件



这次把标准错误输出也做了重定向,所以终端上没有任何输出,所有输出都保存到了各自的文件里。


因为标准错误输出的文件描述符是2,所以上面用了 2> 这种符号重定向标准错误输出。


0x06 将标准输出及错误输出重定向到同一文件



上图先把标准输出重定向到hello.log,然后再通过 2>&1 这个符号,把标准错误输出的文件描述符2,指向当前标准输出的文件描述符1指向的文件,即hello.log,这样标准错误输出就也指向了hello.log。


这里需要注意重定向操作符的顺序,比如下面这个就是错的:



上图中先通过 2>&1,把标准错误输出的文件描述符2,指向当前标准输出的文件描述符1指向的文件,因为当前文件描述符1和2都指向终端,所以这一步是没有任何效果的。


然后,再将标准输出重定向到hello.log


通过上述步骤,标准输出内容就写到了hello.log里,但标准错误输出内容,还是写到了终端里,所以这个写法是不行的。


除了上述方式外,我们还可以用下面的方式,将标准输出/错误输出都重定向到同一文件:



0x07 将标准输出及错误输出追加到同一文件


以上介绍的,将输出重定向到文件的方式,都会覆盖掉原文件的内容,如果不想覆盖原文件的内容,而是想把新的输出追加到该文件,可以用下面的方式:



和覆盖原文件使用的命令差不多,只是多了一个大于号而已。


0x08 将指定字符串作为标准输入内容



上面只是将单行字符串作为标准输入内容,如果想把多行字符串作为标准输入内容,可以用以下方式:



上图中,先将各种输出都重定向到hello.log,然后再将两个xxx之间的内容,作为标准输入。


注意,xxx这个字符串是可以任意指定的。


0x09 将标准输出及错误输出重定向到指定tcp服务器


先用ncat命令开启一个tcp服务器,监听端口9999:



然后用以下命令,将所有输出都重定向到该服务器:



上图中,localhost指定的是目标服务器的地址,9999指定的是目标服务器的端口,其余部分是固定的。


在执行完该命令后,查看ncat命令那张图,就能看到对应的输出了。


0x0a 其他


更多信息,请查看bash的man文档。



最近很多小伙伴找我要一些程序员必备资料,于是我翻出了压箱底的宝藏,免费分享给大家!


扫描海报二维码免费获取。


浏览 624
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报