重定向
我们在用echo曾经用过重定向,但是对重定向并不是非常清楚。下面来解释重定向到底是什么原理。
我们可以尝试把文件描述符的1关闭掉。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
close(1);
int fd=open("txt",O_WRONLY);
if(fd<0)
{
perror("open");
return 1;
}
printf("%d\n",fd);
fflush(stdout);
close(fd);
return 0;
}
此时,可以发现,本来应该输出到显示器上的内容,输出到了文件txt里,其中fd=1。这种现象实际上就是重定向。
常见的重定向:
- >:输出重定向
- >>:追加重定向
- <:输入重定向
输出重定向
当我们使用printf时,一般都会往stdout中输出,但在stdout底层访问文件,还是会找fd=1,但是此时fd=1已经变成了txt的地址,不再是stdout的地址。所以输出的任何信息都会往文件中写入,也就完成了输出重定向。
下面使用:
注意:
shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。
当命令执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。
输入重定向
首先测试用例测试以下:
其实输入重定向也很好理解,在理解了输出重定向之后,输入重定向其实就是将本该输入到stdout里的内容,输入到了重定向后的新文件中。
追加重定向
实际上就是在重定向的含义上加了追加,追加我们都知道,不覆盖之前内容,在之前内容之后继续写入。
下面测试:
这些测试用例都是非常简单的,只是为了验证功能。
显然,追加重定向只是在输出重定向的基础上增加了追加功能,与打开文件的方式有关。
总结
- > 输出重定向到一个文件或设备 覆盖原来的文件
- >! 输出重定向到一个文件或设备 强制覆盖原来的文件
- >> 输出重定向到一个文件或设备 追加原来的文件
- < 输入重定向到一个程序