Linux Shell输入输出重定向

在本章中,我们将详细讨论Shell输入/输出重定向。大多数Linux系统命令从您的终端获取输入并将结果输出发送回您的终端。命令通常从标准输入读取其输入,默认情况下它恰好是您的终端。类似地,命令通常将其输出写入标准输出,默认情况下也是您的终端。

输出重定向

通常使用标准输出的命令的输出可以轻松地转移到文件中。此功能称为输出重定向。

如果符号> file附加到任何将其输出写入到标准输出的命令,则该命令的输出将写入文件而不是终端。

检查以下who命令,该命令重定向用户文件中命令的完整输出。

$ who > users

请注意,终端上没有出现任何输出。这是因为输出已从默认标准输出(终端)重定向到指定文件。您可以检查用户文件以获取完整内容

$ cat users
root     pts/0        2021-10-07 18:26 (10.17.*.*)

如果命令将其输出重定向到文件并且该文件已包含一些数据,则原文件的内容将被覆盖。

您可以使用>>运算符将输出附加到现有文件中,如下所示

$ echo test user > users
$ echo who >> users
$ cat users
test user
root     pts/0        2021-10-07 18:26 (10.17.*.*)

输入重定向

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

通常从标准输入获取输入的命令可以以这种方式从文件重定向其输入。例如,要计算上面生成的文件用户中的行数,您可以执行如下命令

$ wc -l users
2 users

您可以通过从文件users重定向wc命令的标准输入来计算文件中的行数

$ wc -l < users
2

请注意,wc命令的两种形式产生的输出存在差异。 在第一种情况下,文件users的名称与行数一起列出; 在第二种情况下,文件users的名称没有显示。

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

Here文件

Here文档用于将输入重定向到交互式Shell脚本或程序。

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

此处文档的一般形式是:

command << delimiter
document
delimiter

在这里,Shell 将<<运算符解释为读取输入的指令,直到找到包含指定分隔符的行。 然后,所有输入行直到包含分隔符的行都被送入命令的标准输入中。

分隔符告诉Shell,Here文档已经完成。 没有它,Shell将永远读取输入。 分隔符必须是不包含空格或制表符的单个单词。

以下是命令wc -l的输入,用于计算总行数

$ wc -l << EOF
   This is a simple lookup program 
    for good (and bad) restaurants
    in Cape Town.
EOF
3

您可以使用Here文档使用如下所示脚本打印多行

#!/bin/bash

cat << EOF
This is a simple lookup program 
for good (and bad) restaurants
in Cape Town.
EOF

执行后,您将收到以下结果

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

以下脚本使用vi文本编辑器运行会话并将输入保存在文件test.txt

#!/bin/bash

filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

如果您使用vim作为vi运行此脚本,那么您可能会看到如下输出

$ sh test.sh
Vim: Warning: Input is not from a terminal

运行脚本后,您应该看到以下内容添加到文件test.txt

$ cat test.txt
This file was created automatically from
a shell script

丢弃输出

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

$ command > /dev/null

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

要丢弃命令的输出及其错误输出,请使用标准重定向将STDERR重定向到STDOUT

$ command > /dev/null 2>&1

这里2代表STDERR1代表STDOUT。 您可以通过将STDOUT重定向到STDERR来显示消息到STDERR,如下所示

$ echo message 1>&2