linux学习之重定向

杂谈

*不同windows,初学Linux操作系统半个月,真是见了不少不层在win上没见过的,稀奇古怪的概念。
这些概念初次了解有些让人摸不着头脑,但当深入理解后,又觉得十分有意思。
这个由世界上最聪明的计算机人们共同打造出来的系统确实充满魅力,让人想去了解。

当然这个了解的过程绝对没有想象中那般顺利

如果没有网络上的那些可以免费阅读的文档,那些正在学习遇到问题的人们理解与解决起来会有多困难。

我也是免费文章的万千受益者之一,对每一篇文档的作者都心存感谢。但有一点不得不提的,并不是是随便抓一篇文章去看都适用于自己。也许一个概念,需要翻阅好几篇文档,最后才能整个明白。不要紧张,并不是你的理解能力有很大问题,而是这个作者的思维模式不太适用于你。

就好像当初在学习python的面向对象init构造函数时,也是好几个小时看了很多篇文章快吐了也没整明白。好在运气不错,最后被人家一句话点醒:构造函数就是好像是创造一个人,这个人他被创造出来,至少要有手有脚,痛了他也会哭。

接受了太多的馈赠,我也开始想试着去写点东西那些需要帮助的人们。也许我的东西没有穿插那么多专业的术语,看上去逼格不高,但我的初衷也不在于此,我只是想提供一种思维方式给大家,多少帮助到一部分需要帮助的人。

正文 Linux概念之重定向 > 、 >> 、 1> 、 1>> 、2> 、2>> 、2>&1

关于>与>>我已经用过很多次了
最初的理解是 > :将文本覆盖写入到文件中 >> : 将文本追加写入到文件中 如果指定的文件不存在,那么会自动创建。

笔记本没在身边,实验楼凑合用下。调用 ls -l 返回当前d下所有的文件

linux学习之重定向

关于> :打印hello覆盖写入到one_test文件中,即使预先没有创建该文件 linux学习之重定向
关于>> :打印say something追加写入到one_test文件中

linux学习之重定向

非常好理解,初学的时候老师也是这么讲的。但也仅限于此,没再多说,但直到看到了 1> 、 1>> 、2> 、2>>

*问题1:尖括号前面的数字是什么
在linux下,一切皆为文件。不管软件,还是硬件,在linux操作系统下,都以一个文件的方式存在。
而所有被进程访问的文件,内核都会分配一个文件描述符标识。
每个进程下都有一个文件描述符表,记录该进程正在访问的文件文件描述符。
换言之描述符就是是文件的映射。而这个1,2就是文件描述符,顺带提一下0
linux学习之重定向
0 stdin standard_input 标准输入 : shell用过该文件,来获取键盘上的输入,按一个A获取一个A
1 stdout standard_output 标准输出 : 计算机处理过后的信息,shell定向到1,反馈在终端
2 stderr standard_error 标准错误 : 与1大致相同,不同的地方在于1反馈的是处理信息,而2反馈的是错误信息
这三个文件标识符在shell启动的那一刻开始,就已经被分配,再往后打开的文件,其标识符一定大于2

问题2:这有什么用
当我们在运行一段代码时,假如这段代码出现了一部分的出现了一点问题,我们希望能够把正确的部分输出在指定的位置,比如终端,或者某个指定的文件内。而错误的部分被分离出来,比如终端或者某个文件。

示例:创建一个测试的python文件,前半部分可以正常运行反馈,后半部分类型无法转换报错
linux学习之重定向
linux学习之重定向
linux学习之重定向
将标准输出正常输出在终端,而标准错误输出到指定文件error内,不在终端显示linux学习之重定向
将标准输出写入data文件,标准错误追加写入到error文件内

linux学习之重定向
如果不指定描述符会发生什么情况:标准输出定向到指定文件,标准错误依旧显示
linux学习之重定向
如果将所有输出写入同一个文件内(两种方法)

  1. 指定相同文件夹,标准输出可以视情况而定,是覆盖写还是追加写,而标准错误一定是覆盖写
    linux学习之重定向
  2. 推荐:2>&1,与上面结果相同
  3. linux学习之重定向

问题3:这对我们日常的操作有什么帮助
**改变默认的定向,可以将shell反馈重新定向到我们指定的位置。**比如正确输出写入某个文件,报错写入另一个文件。如果希望shell运行后的结果不显示,可以定向到/etc/null下,这个文件不会保存任何数据,永远处于一个空的状态。同时还可以利用它来清空一个文件。