linux shell重定向(输入输出重定向)讲解

linux shell的重定向是个什么东西呢,顾名思义就是重新定位方向,定位什么方向呢,那就是输入和输出的方向,也就是说linux shell的重定向就是改变输入和输出的方向

接下来我讲一下输入跟输出

输入一般是指你通过键盘输入数据,然后shell将你输入的数据进行解释编译然后交给内核运行,这就是标准输入方向,也就是键盘跟程序的关系

反之,输出就是计算机将运算出来的结果通过shell等中间代理将运行的结果反映在外面的显示屏上,这就叫做输出,是从程序到显示屏的关系

文件描述符

linux下一切皆为文件,包括你输入输出用的硬件设备都是文件,linux会给每个打开的文件分配一个ID,也叫作文件描述符,

image-20211212085230782

Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接,其中stdin,stdot,stderr都是默认开启的,可以直接对他们进行操作

输出重定向

我们平时一般的输出结果都是直接显示在显示屏上的,也就是输出带显示屏的,但是有些时候我们为了方便整理输出内容,比如说某网站的运行日志,你说你直接把输出内容通过shell显示出来,这个内容你平时又不会去用到,只有当有问题出现时,你才会想起来要找到其几天的输出结果,而这时候你又因为只对这些输出结果进行了输出而没有进行存储,导致你没地方可以查看,这样就很难受是吧,所以我们就想着把这些输出内容全部存储到一个文件里面,当我们什么时候想要查看的时候,就将这个文件里面的内容打印出来

所以总结一下:我们为什么要进行输出重定向?因为有一些输出结果我们暂时不想然它们直接显示在显示屏上,而是将它们存储起来,这就是输出重定向

标准输出重定向:
command > file  //将执行command命令的输出结果以覆盖的形式重新定位输出到file文件里面
command >> file  //将执行command命令的输出结果以叠加的形式重新定位输出到file文件里面
错误输出重定向:
command 2> file  //将执行command命令的错误的输出结果以覆盖的形式重新定位输出到file文件里面
command 2>> file //将执行command命令的错误的输出结果以叠加的形式重新定位输出到file文件里面
正确错误输出同时重定向:
command >file 2>&1  //将执行command命令的输出的正确和错误结果以覆盖的形式重新定位输出到file文件里面
command >>file 2>&1  //将执行command命令的输出的正确和错误结果以叠加的形式重新定位输出到file文件里面
command >file1 2>file2  //将正确的输出结果以覆盖方式保存在file1,将错误的输出信息以覆盖的方式保存在file2
command >>file1 2>file2  //将正确的输出结果以叠加方式保存在file1,将错误的输出信息以叠加的方式保存在file2

注意事项

  • 重定向符 > 表示覆盖,>> 表示叠加
  • 这里的2>&1中的’&'符号代表转义的意思,就是将后面的那个转义成文件描述符的意思
  • 标准输出如果没有指明,那默认就为1,即command > file中本来应该写成command 1> file的,只是这里他把这个1给省略了而已
  • 文件描述符必须紧挨着重定向符号

输入重定向

输入重定向又是一个什么操作呢,我们可以知道一般输入的数据都是键盘键入的,而这个输入重定向就是不让读取键盘输入的数据,而是我们指定读取输入的数据

标准输入重定向:
command < flie //将file中的内容已覆盖的形式作为command的输入数据进行执行
command << end  //一直读取键盘的命令,知道遇到结束符才停止读取数据,这里的结束符也就是"end",当然这个end结束符是可以自定义的
command <file1 >file2  //将file1中的内容作为command的输入,将标准输出的结果保存到file2文件中

注意事项

  • 标准输出如果没有指明,那默认就为0,即command < file中本来应该写成command 0< file的,只是这里他把这个0给省略了而已
  • 输入重定向符号<<,这个符号的作用是使用特定的分界符作为命令输入的结束标志,而不使用 Ctrl+D 键
  • <<之后的分界符可以自由定义,只要再碰到相同的分界符,两个分界符之间的内容将作为命令的输入(不包括分界符本身)

写在后面

这里要注意一个点,就是这个文件描述符不止有0 1 2,只是bash在打开一个文件的时候他会默认给它分配一个文件描述符,而0 1 2这三个就是它的默认描述符,但是这个描述符是人为可以改变的,比如说linux的sh什么之内的,具体哪些shell的默认描述符是什么我也忘了,有兴趣可以自行百度一下,这个其实对后面我们反弹shell的操作是很有影响的
然后这篇文章其实是我写的那篇linux shell下面的一个分支,但是因为我个人感觉这个东西还是挺重要的,所以我单独拿出来写了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pysnow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值