Unix / Linux - Shell输入/输出重定向

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

输出重定向

命令的输出通常用于标准输出的,可以很容易地转移到文件中.此功能称为输出重定向.

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

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

$ who > users

请注意终端没有输出.这是因为输出已从默认标准输出设备(终端)重定向到指定文件.您可以查看用户文件中的完整内容 :

$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

如果命令将其输出重定向到文件且文件已包含某些数据,则该数据将丢失.考虑以下示例 :

$ echo line 1 > users
$ cat users
line 1
$

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

$ echo line 2 >> users
$ cat users
line 1
line 2
$

输入重定向

正如命令的输出可以重定向到文件一样,命令的输入也可以从文件重定向.由于大于字符> 用于输出重定向,小于字符< 用于重定向命令的输入.

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

$ wc -l users
2 users
$

执行后,您将收到以下输出.您可以通过从文件 users :

$ wc -l < users
2
$

请注意,两种形式的wc命令产生的输出存在差异.在第一种情况下,文件用户的名称列出行数;在第二种情况下,它不是.

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

这里文档

A 此处文档用于将输入重定向到交互式shell脚本或程序.

我们可以在shell脚本中运行交互式程序而无需用户操作交互式程序或交互式shell脚本的输入.

here 文档的一般形式是 :

command << delimiter
document
delimiter

这里shell解释<<< 运算符作为指令读取输入,直到找到包含指定分隔符的行.然后将包含分隔符的行的所有输入行输入到命令的标准输入中.

分隔符告诉shell 此处文档具有完成.没有它,shell继续永远读取输入.分隔符必须是不包含空格或制表符的单个单词.

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

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

您可以使用此处文件打印多行使用您的脚本如下;

#!/bin/sh

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/sh

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
$

丢弃输出

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

 
 $命令>/dev/null

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

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

$ command > /dev/null

这里 2 代表 STDERR 1 代表 STDOUT .您可以通过将STDOUT重定向到STDERR来显示STDERR上的消息,如下所示 :

$ echo message 1>&2

重定向命令

以下是可用于重定向和减号的完整命令列表;

Sr.No.命令&描述
1

pgm>文件

pgm的输出被重定向到文件

2

pgm<文件

程序pgm从文件读取其输入

3

pgm>>文件

pgm的输出附加到文件

4

n>文件

来自描述符 n 的流的输出重定向到文件

5

n>>文件

来自流的输出,其中描述符 n 附加到文件

6

n>& m

将流 n 的输出合并为流 m

7

n <& m

将流 n 的输入合并为流 m

8

<< tag

标准输入来自此处行开头的下一个标记

9

&verbar;

从一个程序或进程获取输出,并将其发送到另一个程序

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