Linux shell之重定向_shell输出重定向到文件

bash shell : < 将文件的内容重定向命令中,作为命令的输入
bash shell : << 输入不需要文件进行重定向,只需要在命令行中指定用于输入重定向的数据即可


输入重定向:  
 wc命令用来对数据中的文本进行计数,默认情况下:  
 文本的行数 文本的单词个数 文本的字节数  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/dfd0e6e3706a466bbb3f2091e1867194.png)  
 内联输入重定向:  
 必须指定一个文本标记来划分输入数据的开始结尾。任何字符串都可以作为文本标记,单开始和结尾的文本标记必须一致  
 (1)以EOF作为文本标记  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/cd3741aec4d148c38cd2baf1efbc7376.png)  
 (2)以hi作为文本标记  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d40740939e2e4d20a8abd8a7b3994165.png)


## 三、重定向原理


来自于我的这篇文章:[Linux fork 写时复制]( )


分离fork和exec的做法在构建Linux shell的时候非常有用,这给了shell在fork之后exec之前运行代码的机会,这些代码可以在运行一个全新的程序前改变环境。  
 shell也是一个用户程序,它会显示一个提示符,等待用户的输入。  
 当我们向shell输入一个命令(一个可执行的程序)时,shell就在文件系统中找到这个可执行的程序,通过调用fork()创建新进程,并调用exec系列函数来执行这个可执行的程序,调用wait()等待该命令的完成。子进程执行结束后,shell从wait()返回并再次输出提示符,等待用户的下一条命令。


那么现在我们通过一个小例程来体会一下fork + exec组合分离的强大功能:



#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <string.h>

int main()
{
int ret = fork();
if(ret == 0){
//fork之后,exec执行之前,来改变一些子进程运行的环境
//关闭 STDOUT_FILENO : 标准输出,对应的文件描述符为 1
close(STDOUT_FILENO);
//打开file.txt文件,这样 wc 的执行结果写入file.txt文件中
open(“./file.txt”, O_CREAT | O_WRONLY | O_TRUNC , S_IRWXU);

    char \*my_args[3];
    my_args[0] = strdup("wc");
    my_args[1] = strdup("fork\_exec.c");
    my_args[2] = NULL;

	//执行exec函数,运行一个新shell程序:wc fork\_exec.c
    execvp(my_args[0], my_args);
    
}else if(ret > 0){
    wait(NULL);
    
}else{
    printf("fork error\n");
    return -1;
}

return 0;

}


从结果可以看出两者运行的结构一致:  
 wc用来统计指定文件的行数、字数,以及字节数。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/92ad449142db4c0aa11e95b7abcfe7e3.png)  
 shell重定向的原理:当shell调用fork完成子进程的创建后,shell在调用exec()之前先关闭了标准输出,  
 然后打开文件redirect.txt,这样shell命令wc 的输出结果就被发送到文件redirect.txt中,而不是输出给标准输出,打印在屏幕上。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/88228dcc057d40ab827f44c9f4076dd6.png)


## 总结


注意,不管是输出重定向还是输入重定向,命令总是在左边。重定向的符号指向数据的流动方向。








为了做好运维面试路上的助攻手,特整理了上百道 **【运维技术栈面试题集锦】** ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,**小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。**

![](https://img-blog.csdnimg.cn/img_convert/566bfd1b930c7171c7960eb14aeb8ab5.png)

本份面试集锦涵盖了

*   **174 道运维工程师面试题**
*   **128道k8s面试题**
*   **108道shell脚本面试题**
*   **200道Linux面试题**
*   **51道docker面试题**
*   **35道Jenkis面试题**
*   **78道MongoDB面试题**
*   **17道ansible面试题**
*   **60道dubbo面试题**
*   **53道kafka面试**
*   **18道mysql面试题**
*   **40道nginx面试题**
*   **77道redis面试题**
*   **28道zookeeper**

**总计 1000+ 道面试题, 内容 又全含金量又高**

*   **174道运维工程师面试题**

> 1、什么是运维?

> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

> 3、现在给你三百台服务器,你怎么对他们进行管理?

> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点

> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

> 7、Tomcat和Resin有什么区别,工作中你怎么选择?

> 8、什么是中间件?什么是jdk?

> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?

> 10、什么叫CDN?

> 11、什么叫网站灰度发布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

> 17、如何重置mysql root密码?
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值