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

共 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文档。








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




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








浏览 633
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报