linux 文件重定向

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40921797/article/details/82056426

我们通过只前的博客对文件io有了一定的了解。在今天我们说的文件重定向。就要求我们对文件有一定的了解。具体文件io看博客:系统文件调用io操作接口

什么是文件重定向

标准输入输出重定向:是指将原来从标准输入读取数据的文件操作重新定向为从向其他文件读取数据;将原来要输出到标准输出的内容,从新定向输出到指定的其他文件中。
举个比方:这个贴着1 的盒子原来放糖果用,后来你不想放糖果了,把糖果倒了出来,改放曲奇饼干了。

标准输出重定向命令

<     //标准输入重定向
>     //标准输出重定向   清空原先的内容后添加新的内容 
>>    //标准输出重定向   在原来内容换行下方添加新的内容

举个例下:

//echo "hello world" >> ./test.txt
将原先输出到显示器的数据改输入到text.txt文件中
./test.exe      2 > &1  >./test.txt
//首先每个文件都有文件描述符我们在只前见过,详细链接见文章开头
//stdin 标准输入 0;stdout 标准输出 1;sterr 标准错误输出 2
//将错误信息(2)从定向到标准输出(1),将标准输出(1)重定向到文件(id)
//结果是:错误信息显示在显示屏,标注输出打印的内容写入到文件中。

n >& m 表示:将输出文件 m 和 n 合并,而且n重定向到m。
n <& m 表示:将输入文件 m 和 n 合并,而且n重定向到m。

./test.exe  >./test.txt   2>&1
//将错误信息(2)重定向到文件(id),将标准输出(1)重定向到错误信息(此时错误信息已经重定向改成了文件的id)
//结果:将错误信息和标准输出打印的内容都写入文件中了。

文件重定向实质

我们已经知道,每个文件都有其对应的文件标识符,而文件的标识符实际上就是管理文件的结构体的数组的下标,而且是优先使用下标数值较小的下标值(文件描述符)。
那么对文件输入输出的重定向,就是改变对应的文件下标的指向,改变其指向的文件描述信息。
对文件描述符的复制,就是复制的该下标的指针。

代码中如何重定向

#include<unistd.h>
int dup(int oldfd);
//复制oldfd的文件描述符
//举个例子:fd=dup(1); 表述向fd所指的文件描述符代表文件中写入数据,实际就是向标准输出(1)写入数据。则结果:写入数据会被打印到屏幕。

int dup2(int oldfd,int newfd);
//将newfd描述符从指向原本的文件,重新修改指向指向到oldfd所指向的文件去。
//如果newfd原先有指向的文件,那么那个文件将会被关闭。close(fd);会被系统调用

/dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将标准输出(1)重定向到文件: /dev/null ;

//例子:
./test.exe  >/dev/null  2
//结果知道把屏幕上比显示错误信息。这可是自欺欺人哦,一般还是不要这样做的好哦。哈哈。

/dev/null是一个特殊的文件,写入到它的内容想到与被丢弃,像极了windows的回收站,可是如果我们从null找文件可是什么都赵不到的哦。
而dev则是Linux内核的设备管理器。具体参见博客linux根目录下各个目录的详细介绍

猜你喜欢

转载自blog.csdn.net/weixin_40921797/article/details/82056426