LinuxShell重定向和管道

Linux Shell 提供重定向符用于重定向命令的输入和输出,提供管道符用于将一个命令的输出重定向作为另一个命令的输入。

【注】在终端命令上,重定向符总是指向数据流动的方向。

1. 输出重定向

1.1 输出重定向符 >

1
command > outputfile

> 重定向符用于把 command 命令的输出结果重定向输入到指定的 outputfile 文件中。

  • 如果 outputfile 不存在,则自动创建。

  • 如果 outputfile 文件有内容,则全部覆盖。

1.2 输出重定向符 >>

1
command >> outputfile

>> 重定向符用于把 command 命令的输出结果重定向追加到指定的 outputfile 文件中。

  • 如果 outputfile 不存在,则自动创建。

  • 如果 outputfile 文件有内容,则继续追加到文件末尾。

2. 输入重定向

2.1 输入重定向符 <

1
command < inputfile

< 重定向符用于将文件中的内容重定向输入给 command 处理。

2.2 输入重定向符 <<

1
2
3
command << marker
data
marker

<< 重定向符也被成为内联输入重定向符,该输入重定向用于从命令行中指定用于输入重定向的数据,而不用使用文件进行输入重定向。
其中,data 是指定用于输入重定向的数据,marker 为文本标记(可用任何字符串作为文本标记),用于划分输入数据的开始和结尾。

  • marker 仅被字符串看待,不会被扩展成变量、命令、算术表达式等。
  • marker 中如果没有任何一部分被引号包裹,则输入数据 data 中每一行数据将扩展变量、命令、算术表达式(因此若要使用特殊字符诸如 $ 则需进行转义 \$)。
  • marker 中如果有任何一部分被引号包裹,则输入数据 data 中的每一行数据将只被看作为字符串处理。
  • 如果在输入重定向符 << 后加上 -,即 <<-,则在读取输入数据 data 的每一行数据时,其前导 Tab 会被忽略。

内联输入重定向符可以用来在 Shell 中进行自动交互,以 ssh-keygen 命令为例:

1
2
3
4
5
6
7
#!/bin/bash

ssh-keygen -t rsa -C "example@163.com" << EOF
$HOME/Tmp/example


EOF

这样就能实现 ssh-keygen 自动生成密钥并保存的功能,而不需要通过人为手动输入来进行交互。

【注】更多自动交互方法参见 LinuxShell自动交互

3. 管道

1
command1 | command2

| 用于将 command1 的输出重定向作为 command2 的输入:

  • command1 的输出会被实时重定向到 command2 的输入,中间数据传输不会用到任何中间文件或缓冲区。

  • Linux 系统实际上会同时运行 command1command2,并在内部将它们连接起来。而不是表面看起来先运行 command1 然后在运行 command2

附录

更多详细介绍可参见以下资料: