0%

stdin-stdout-stderr

文件描述符(File descriptor),计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。文件描述符在形式上是一个非负整数,实际上它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中, 一些涉及底层的程序编写往往会围绕着文件描述符展开。

一、概念

  1. 标准输入(stdin):文件描述符为0,使用<<<来获取数据,等于数据是从左边往命令里面流。
  2. 标准输出(stdout):文件描述符为1,使用>>>来输出数据,所以数据的来源是命令。
  3. 标准错误输出(stderr):文件描述符为2,使用2>2>>
  4. 文件重定向,也叫标准输入输出重定向,是指将原来从标准输入读取数据的文件操作重新定向为从向其他文件读取数据,或将原来要输出到标准输出的内容,重定向输出到指定的其他文件中。
    • <:标准输入重定向
    • >:标准输出重定向,清空原先的内容后添加新的内容
    • >>:标准输出重定向,在原来内容换行下方添加新的内容

每个文件都有其对应的文件标识符,而文件的标识符实际上就是管理文件的结构体的数组的下标,而且是优先使用下标数值较小的下标值(文件描述符)。

那么对文件输入输出的重定向,就是改变对应的文件下标的指向,改变其指向的文件描述信息。
对文件描述符的复制,就是复制的该下标的指针。

二、实战

  1. * * * * * test.sh > /dev/null 2>&1 &

    • crontab讲解
    1
    2
    3
    4
    5
    6
    7
    # .---------------- minute(0 - 59)
    # | .------------- hour(0 - 23)
    # | | .---------- day of month(1 - 31)
    # | | | .------- month(1 - 12) OR jan,feb,mar,apr ...
    # | | | | .---- day of week(0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # | | | | |
    # * * * * *
    • 标准输入输出讲解
      • /dev/null是一个特殊的文件,写入到它的内容相当于被丢弃。所以> /dev/null表示标准输出重定向到空设备文件,也就是不输出任何信息到终端。
      • 2>&1:将标准出错重定向到标准输出,标准输出已经重定向到了/dev/null空设备文件,所以标准错误输出也重定向到空设备文件。
      • &:最后一个&是让该命令在后台执行。
    • 最后结果:定时在后台执行test.sh脚本,把标准输出和标准错误全重定向到空设备
  2. shell脚本

    • 文件内容1.txt
    1
    2
    3
    4
    5
    1
    2
    3
    4
    5
    • 脚本1
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    for i in `cat 1.txt`
    do
    echo $i >> 1.csv
    done

    结果:依次输出1——5到1.csv,最终内容也为1——5
    • 脚本2
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    for i in `cat 1.txt`
    do
    echo $i >> 1.csv
    done

    结果:依次输出1——5到1.csv,最终内容5

三、参考

  1. 参考一
  2. 参考二