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
)。