• Linux shell之重定向



    前言

    我们有些时候想要将命令的输出保存起来,而不仅仅是让它输出到显示器上(终端上)。将命令的输出保存再文件中后方便分析输出的内容。重定向也可以是输出也可以是输入。

    一、输出重定向

    输出重定向:将命令的输出发送的一个文件中,终端输出的内容会被保存到输出文件中

    bash shell : >    输出的内容会覆盖已有文件的内容
    bash shell : >>   输出的内容追加到已有的文件中
    
    • 1
    • 2

    在这里插入图片描述
    覆盖重定向:
    在这里插入图片描述
    追加重定向:
    在这里插入图片描述

    二、输入重定向

    输入重定向:将文件的内容重定向到命令中

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

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

    三、重定向原理

    来自于我的这篇文章: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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

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

    总结

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

  • 相关阅读:
    【Web前端】5分钟掌握画布元素的使用
    最频繁值(区间最值POJ3368)
    Guava LongMath类
    实战演练 | 使用 Navicat Premium 自动运行数据库复制
    WebSocket开发(客服对话)功能
    [游戏开发][Unity]Unity运行时加载不在BuildSetting里的场景
    印刷企业如何利用MES管理系统改善生产计划
    化工园区数字孪生可视化管控平台,赋予园区安全环保智慧发展
    3. 查询处理
    磁钢的居里温度和工作温度
  • 原文地址:https://blog.csdn.net/weixin_45030965/article/details/125417793