大多数Linux系统命令从终端接收输入并将输出结果发送回终端。命令通常从标准输入读取其输入,而标准输入在默认情况下恰好是终端。同样地,命令通常将其输出写入标准输出,默认情况下,标准输出也是终端。本文主要介绍Linux shell脚本中输入/输出重定向(IO重定向)。

1、输出重定向

通常用于标准输出的命令的输出可以很容易地转移到文件中。这种操作称为输出重定向。使用>将其输出写入标准输出,该命令的输出将被写入文件而不是终端。

可以将命令输出的结果保存文件,

例如,

$ ps > log

注意:终端上没有输出。是由于输出已经从默认的标准输出设备(终端)重定向到指定的文件。可以查看文件中的内容。

$ cat log
  PID TTY          TIME CMD
 5739 pts/0    00:00:00 bash
 5808 pts/0    00:00:00 ps

如果命令的输出被重定向到一个文件,并且这个文件已经包含了一些数据,那么这些数据将会丢失。

例如,

$ echo cjavapy > log
$ cat log
cjavapy
$ 

可以使用>>操作符将输出追加到现有文件中,如下所示,

$ echo c java python >> users
$ cat users
cjavapy
c java python
$

2、输入重定向

命令的输出可以重定向到文件,命令的输入也可以从文件重定向。>用于输出重定向,<用于重定向命令的输入。

通常从标准输入获取输入的命令可以以这种方式从文件重定向其输入。例如,

要计算上面生成的文件用户中的行数,使用重定向可以执行如下命令:

$ wc -l log
47 log

通过从文件用户重定向wc命令的标准输入,可以计算文件中的行数:

$ wc -l < log
47

注意:两种形式的wc命令产生的输出是不同的。第一种情况下,文件用户的名称与行数一起列出;在第二种情况下,情况并非如此。

在第一种情况下,wc知道它正在从文件用户读取输入。第二种情况下,它只知道从标准输入中读取输入,因此不显示文件名。

3、Here Document

Here Document用于将输入重定向到交互式shell脚本或程序中。

通过为交互式程序或交互式shell脚本提供所需的输入,可以在不需要用户操作的情况下在shell脚本中运行交互式程序。

一般形式:

command << 分隔符
文档内容
分隔符

<<操作符作为指令读取输入,直到找到包含指定分隔符停止输入。然后将包含分隔符的行之前的所有输入行输入到命令的标准输入中。

分隔符表示shell Here Document已经完成。没有它,shell将继续永远读取输入。分隔符必须是不包含空格或制表符的单个单词。

例如,

$ wc -l << EOF
   c java python is cjavapy 
https://www.cjavapy.com
	linux shell
EOF
3
$

可以使用Here Document打印多行,使用脚本如下所示,

#!/bin/bash
cat << EOF
   c java python is cjavapy 
   https://www.cjavapy.com
   linux shell
EOF

输出:

   c java python is cjavapy 
   https://www.cjavapy.com
   linux shell

下面的脚本使用vi文本编辑器运行一个会话,并将输入保存到文件demo.txt中。

#!/bin/bash
filename=demo.txt
vi -c ":wq! $filename" - << EOF
   c java python is cjavapy 
   https://www.cjavapy.com
   linux shell
EOF

如果使用vim作为vi运行该脚本,可能会看到输出如下警告:

$ bash demo.sh
Vim: Reading from stdin...
$

运行脚本后,应该会看到以下内容被添加到demo.txt文件中:

$ cat demo.txt
   c java python is cjavapy 
   https://www.cjavapy.com
   linux shell

4、丢弃输出

有时需要执行命令,但不希望输出显示在屏幕上。在这种情况下,可以通过将输出重定向到文件/dev/null来丢弃输出。如下:

$ command > /dev/null

command是要执行的命令的名称。文件/dev/null是一个特殊的文件,它会自动丢弃所有的输入。

若要丢弃命令的输出及其错误输出,使用重定向将STDERR重定向到STDOUT,如下:

$ command > /dev/null 2>&1

2代表STDERR, 1代表STDOUT。通过将STDOUT重定向到STDERR,可以将消息显示到STDERR,方法如下:

$ echo message 1>&2

5、重定向命令

下面是可以用于重定向的命令列表:

命令

说明

mand > file

将输出重定向到 file。

command < file

将输入重定向到 file。

command >> file

将输出以追加的方式重定向到 file。

n > file

将文件描述符为 n 的文件重定向到 file。

n >> file

将文件描述符为 n 的文件以追加的方式重定向到 file。

n >& m

将输出文件 m 和 n 合并。

n <& m

将输入文件 m 和 n 合并。

<< tag

将开始标记 tag 和结束标记 tag 之间的内容作为输入。

|

接收一个程序或进程的输出,并将其发送给另一个程序或进程

注意:文件描述符0通常是标准输入(STDIN), 1是标准输出(STDOUT), 2是标准错误输出(STDERR)。

推荐文档