linux IO重定向精讲

大家好,我是yison

个人网站:www.argunriver.com

github:www.github.com/datud

围脖:朱临路

大家好,今天给大家带来的是IO重定向

我们打开终端,输入date命令,可以看到如下图所示的输出

当我们输入date >date.txt(date后有没有空格都行,date.txt这个文件目前没有),我们可以从下图看到没有任何显示,我们展示当前目录下的文件,可以看到已经有date.txt这个文件了

我们查看date.txt文件的内容,发现它就是刚刚打印到屏幕的内容

也就是说通过这样一个符号将其引导到了一个文件中,我们把这样的一种行为叫做进程的一种重定向的行为

我们再看一个小例子,我们打开终端,输入tty

tty叫做显示当前的终端,我们知道,在linux中一切皆文件。重定向后面跟的一定是一个文件,现在我们用date >/dev/pts/1

这个命令的结果同样是将data命令的结果输入到文件里面去,但此时此刻这个文件不是一个常规文件,它是一个设备文件

此时我们看到date内容显示了出来,也就是说我们平时输入的一些命令所显示的内容都存到了/dev/pts/1这个文件,这里的1指的是你打开的第几个终端,如果我们现在将上面的内容重定向到/dev/pts/2,请注意,这个操作是在第一个终端完成的不是在第二个终端

我们看到并没有输出,因为我们是写到了第二个终端,所以我们可以在终端2中看到了输出

此时,在终端1中,我们输入date >date.txt,连输入三行,那么在date.txt文件中有几行呢?

答案是只有一行

这种重定向的行为非常有用,比如我们现在做了一个to do list,每天五点起床取备份一个数据,那么备份既有可能成功也有可能失败,肯定不可能当时去看看屏幕,而是把程序执行的结果存入到文件中,这个结果可能是正确的,也可能是错误的,我们希望拿到的数据可以判定备份是否成功以及失败的原因,因此我们可以在备份过程中进程产生的一些消息做重定向。

那么有三种重定向方式,分别是标准输入、标准输出、标准错误。

file descriptions(FD,文件描述符或Process I/O channels),在windows中叫文件句柄,进程使用文件描述符来管理打开的文件,每打开一个文件都会有一个文件标识。这里有点难懂,我们打开终端,输入ls /proc/,这里是放一些进程的信息的,在这里面有很多数字,我们随便找一个,比如26

输入ls /proc/26,在这里我们发现有一个fd的文件夹。

在这里面就代表的是该进程打开的相应的文件,每打开一个文件就会有一个对应的数字表示,这里有三个特殊的文件,分别是0,1,2,0(stdin)代表的是进程打开的输入的文件,1代表的是输出,2表示的也是输出,不同的是1表示的是正确输出(stdout),2表示的是错误输出(stderr)。

大家可以简单理解,当一个进程在运行的时候,它如果产生的是正确的输出,会到1里面取,1到屏幕,错误的话到2,2到屏幕。

我们举个例子:

输入ls /home

这个命令的结果是正确的

如果我们重定向:ls /home 1>list.txt(1是标注输出,本身位置是在屏幕上,就是终端,我们将1重定向到list.txt,这个文件现在并不存在,我们想把ls /home这个进程运行时产生的正确消息重定向,所以并没有显示)

如果我们执行下列操作:ls /home /haha 1>list.txt,haha这个文件并不存在,我们可以预计到它会产生一个错误的输出与一个正确的输出

我们只是将1进行了重定向,终端本应显示home下面的数据,但是并没有显示,因为我们将它进行了重定向。(这里有点难懂,我们说了,这里应该显示一个错误一个正确,现在只显示了错误,是因为我们并没有对错误进行重定向,但是我们对正确做了重定向,所以只能看到错误而看不到正确,所以1到了一个文件)。那么我们对2进行重定向

ls /home /haha  1>list.txt 2>error.txt

这时没有了输出,刚刚我们讲过,每天5点起床备份数据,我们可以通过to do list定时,但是我们肯定不想这么早爬起来看看备份是否成功或失败,那么我们就可以将所有的正确和错误信息分别重定向到两个文件。

我们来看一下:

cat list.txt

cat error.txt

这里显示的是出错的消息

对了,对于1我们可以不用写这个数字,因为它代表的就是标准输出,但是2一定要写

那么如何将错误和正确重定向到一个文件呢:ls /home /hshs &>list1.txt(&在linux中各个位置的意义不一样,在这是混合输出,也就是将正确和错误都重定向到同一个文件)

 

好了,今天我们就讲这么多,咱们下期见!

欢迎关注我的围脖:朱临路

谢谢

转载请注明出处

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值