linux shell的重定向是个什么东西呢,顾名思义就是重新定位方向,定位什么方向呢,那就是输入和输出的方向,也就是说linux shell的重定向就是改变输入和输出的方向
接下来我讲一下输入跟输出
输入一般是指你通过键盘输入数据,然后shell将你输入的数据进行解释编译然后交给内核运行,这就是标准输入方向,也就是键盘跟程序的关系
反之,输出就是计算机将运算出来的结果通过shell等中间代理将运行的结果反映在外面的显示屏上,这就叫做输出,是从程序到显示屏的关系
文件描述符
linux下一切皆为文件,包括你输入输出用的硬件设备都是文件,linux会给每个打开的文件分配一个ID,也叫作文件描述符,
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下面的一个分支,但是因为我个人感觉这个东西还是挺重要的,所以我单独拿出来写了