Linux Shell重定向(输入输出重定向)

作者:Gakki

前言
  • 在 bash 中,在执行一个命令之前,可以使用重定向操作符对该命令的输入、输出进行重定向。从其他文件获取输入,把命令输出写到其他文件。
  • 定向分为输入重定向与输出重定向。字面上理解就是改变输入/输出的方向
  • 一般情况下,标准的输入方向就是从键盘到程序;标准的输出方向就是从程序到显示器。
  • Linux 中一切皆文件,包括标准输入设备(键盘)和标准输出设备(显示器)在内的所有计算机硬件都是文件。为了表示和区分已经打开的文件,Liunx 会给给每个文件分配一个 ID ,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。
文件描述符 文件名 类型 硬件 备注
0 STDIN 标准输入文件 键盘 默认从stdin读取数据
1 STDOUT 标准输出文件 显示器 默认向stdout输出数据
2 STDERR 标准错误输出文件 显示器 向stderr流中写入错误信息
  • 注:一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件。stdin、stdout、stderr 默认都是打开的,在重定向的过程中,0、1、2 这三个文件描述符可以直接使用。
输出重定向
  • 在输出重定向中,> 表示覆盖,>>表示追加。
# 标准输出重定向 
command >file:以覆盖的方式,把 command 的正确输出结果输出到 file 文件中。
command >>file: 以追加方式,把 command 的正确输出结果输出到 file 文件中。

# 标准错误输出重定向
command 2>file:以覆盖的方式,把 command 的错误信息输出到 file 文件中。
command 2>>file:以追加的方式,把 command 的错误信息输出到 file 文件中。

# 正确输出和错误信息同时保存
command >file 2>&1:以覆盖的方式,把正确输出和错误信息同时保存到同一文件(file)中。
command >>file 2>&1:以追加的方式,把正确输出和错误信息同时保存到同一个文件(file)中。
command > file1 2>file2:以覆盖的方式,把正确的输出结果输出到 file1 文件中,把错误的信息输出到 file2 文件中。
command >>file1 2>>file2:以追加的方式,把正确的输出结果输出到 file1 文件后中,把错误的信息输出到 file2 文件中。
command >file 2>file 或 command >>file 2>>file:【不推荐】,会导致 file 打开两次,引起资源竞争,导致 stdout 和 stderr 会互相覆盖

注:

  • 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null 。命令:command > /dev/null/dev/null是一个文件,这个文件比较特殊,所有写入到它的内容都会被丢弃。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。如果希望屏蔽 stdout 和 stderr,可以这样写:command > /dev/null 2>&1
  • 2>&1:表示复制标准错误输出的文件描述符 2 到标准输出的文件描述符 1。
输入重定向
  • 输入重定向就是改变输入的方向,不再使用键盘作为命令输入的来源,而是使用文件作为命令的输入。
符号 说明
command 将 file 文件中的内容作为 command 的输入。
command < 从标准输入(键盘)中读取数据,直到遇见分界符 tag 才停止(分界符可以是任意的字符串,用户自己定义)
command file2 将 file1 作为 command 的输入,并将 command 的处理结果输出到 file2

注: 输入重定向的完整写法也是 fd ,其中 fd 表示文件描述符,如果不写,默认为 0,也就是标准输入文件。

重定向的先后顺序
  • 重定向的先后顺序:当指定了多个重定向操作时,按照重定向出现的顺序,从左到右处理。
  • command > file 2>&1:将标准输出和标准错误指向文件 file
  • command 2>&1 > file:只将标准输出定向到文件 file。因为在将标准输出重定向到 file 之前,标准错误已经从标准输出中复制了。
  • 解释说明:
    • 对于 command > file 2>&1 命令来说,第一个 > file 表示重定向 command 命令的标准输出到 file 文件。第二个 2>&1 表示复制标准错误输出到标准输出。由于标准输出已经被重定向到 file 文件,所以 file 文件会包含 command 命令的标准输出和标准错误输出。
    • command 2>&1 > file 命令只重定向标准输出到 file 文件,标准错误输出只会打印打终端。第一个 2>&1 表示复制标准错误输出到标准输出,换句话说就是:把标准错误输出写入到标准输出对应的文件。但此时标准输出还没有重定向,会关联到默认的终端,所以标准错误输出会写入到终端。
      第二个 > file 表示把标准输出重定向到 file 文件。这并不会影响到标准错误输出,标准错误输出还是会指向终端。因此,标准错误输出没有重定向到 file 文件。

注:

  • 输出重定向完整的写法是 fd>file 或者 fd>> file ,其中 fd 表示文件描述符。如果不写,默认为 1 。也就是标准输出文件。如:command 1> file 一般写作 command >file。当文件描述符为大于 1 的值时,比如 2,就必须写上。
  • fd> 之间不能有空格,否则 Shell 会解析失败;>file 之间的空格可有可无。为了保持一致性,建议 > 两边都不加空格。
其他
  • 大于符号 > 用于输出重定向,小于符号 < 用于输入重定向。

你可能感兴趣的:(Linux Shell重定向(输入输出重定向))