上犹电脑信息网我们一直在努力
您的位置:上犹电脑信息网 > 文件问题 > Linux shell编程 13标准输入、输出及文件重定向-dps文件怎么打开

Linux shell编程 13标准输入、输出及文件重定向-dps文件怎么打开

作者:上犹日期:

返回目录:文件问题

5.6 标准输入、输出和错误

当我们在 s h e l l中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆, s h e l l同时也给出了相应的文件名。

下面就是这些文件描述符及它们通常所对应的文件名:

文 件 文件描述符

输入文件—标准输入 0

输出文件—标准输出 1

错误输出文件—标准错误 2

系统中实际上有1 2个文件描述符,但是正如我们在上表中所看到的, 0、 1、 2是标准输入、输出和错误。可以任意使用文件描述符 3到9。

5.6.1 标准输入

标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。

5.6.2 标准输出

标准输出是文件描述符 1。它是命令的输出,缺省是屏幕,也可以是文件。

5.6.3 标准错误

标准错误是文件描述符 2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。你可能会问,为什么会有一个专门针对错误的特殊文件?这是由于很多人喜欢把错误单独保存到一个文件中,特别是在处理大的数据文件时,可能会产生很多错误。

如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说是你的终端)。

5.7 文件重定向

在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。表5 - 1列出了最常用的重定向组合,并给出了相应的文件描述符。

在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是必需的。为了完整起见,我们在表 5 - 1中列出了两种方法。

表5-1 常用文件重定向命令

command > filename 把把标准输出重定向到一个新文件中

command >> filename 把把标准输出重定向到一个文件中 (追加)

command 1 > fielname 把把标准输出重定向到一个文件中

command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中

command 2 > filename 把把标准错误重定向到一个文件中

command 2 >> filename 把把标准输出重定向到一个文件中 (追加)

command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中 (追加)

command < filename >filename2 把c o m m a n d命令以 f i l e n a m e文件作为标准输入,以 f i l e n a m e 2文件作为标准输出

command < filename 把c o m m a n d命令以f i l e n a m e文件作为标准输入

command << delimiter 把从标准输入中读入,直至遇到 d e l i m i t e r分界符

command <&m 把把文件描述符 m作为标准输入

command >&m 把把标准输出重定向到文件描述符 m中

command <&- 把关闭标准输入

5.7.1 重定向标准输出

让我们来看一个标准输出的例子。在下面的命令中,把 / e t c / p a s s w d文件中的用户 I D域按照用户命排列。该命令的输出重定向到 s o r t . o u t文件中。要提醒注意的是,在使用 s o r t命令的时候(或其他含有相似输入文件参数的命令 ),重定向符号一定要离开 s o r t命令两个空格,否则该命令会把它当作输入文件。

$ cat passwd | awk -F: '{print $1}' | sort 1>sort.out

从表5 - 1中可以看出,我们也可以使用如下的表达方式,结果和上面一样:

$ cat passwd | awk -F: '{print $1}' | sort >sort.out

可以把很多命令的输出追加到同一文件中。

Linux shell编程 13标准输入、输出及文件重定向

在上面的例子中,所有的目录名和以 a c c o u n t开头的文件名都被写入到 f i l e . o u t文件中。

如果希望把标准输出重定向到文件中,可以用 > f i l e n a m e。在下面的例子中, l s命令的所有输出都被重定向到 l s . o u t文件中:

$ ls >ls.out

如果希望追加到已有的文件中 (在该文件不存在的情况下创建该文件 ),那么可以使用

> > f i l e n a m e:

Linux shell编程 13标准输入、输出及文件重定向

如果想创建一个长度为 0的空文件,可以用' > f i l e n a m e ':

$ >myfile

5.7.2 重定向标准输入

可以指定命令的标准输入。在 a w k一章就会遇到这样的情况。下面给出一个这样的例子:

$ sort < name.txt

在上面的命令中, s o r t命令的输入是采用重定向的方式给出的,不过也可以直接把相应的文件作为该命令的参数:

$ sort name.txt

在上面的例子中,还可以更进一步地通过重定向为 s o r t命令指定一个输出文件 n a m e . o u t。

这样屏幕上将不会出现任何信息 (除了错误信息以外):

$ sort <name.txt >name.out

在发送邮件时,可以用重定向的方法发送一个文件中的内容。在下面的例子中,用户l o u i s e将收到一个邮件,其中含有文件 c o n t e n t s . t x t中的内容:

$ mail louise < contents.txt

重定向操作符command << delimiter是一种非常有用的命令,通常都被称为“此处”文挡。

我们将在本书后面的章节深入讨论这一问题。现在只介绍它的功能。 s h e l l将分界符d e l i m i t e r之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, s h e l l就知道输入结束了。这一命令对于自动或远程的例程非常有用。可以任意定义分界符 d e l i m i t e r,最常见的是E O F,而我最喜欢用 M AY D AY,这完全取决于个人的喜好。还可以在 < <后面输入变量。

下面给出一个例子,我们创建了一个名为 m y f i l e的文件,并在其中使用了 T E R M和L O G N A M E变量。

Linux shell编程 13标准输入、输出及文件重定向

5.7.3 重定向标准错误

为了重定向标准错误,可以指定文件描述符 2。让我们先来看一个例子,因为举例子往往会让人更容易明白。在这个例子中, g r e p命令在文件m i s s i l e s中搜索t r i d e n t字符串:

Linux shell编程 13标准输入、输出及文件重定向

g r e p命令没有找到该文件,缺省地向终端输出了一个错误信息。现在让我们把错误重定向到文件/ d e v / n u l l中(实际就上是系统的垃圾箱 ):

$ grep "trident" missiles 2>/dev/null

这样所有的错误输出都输送到了 / d e v / n u l l,不再出现在屏幕上。

如果你在对更重要的文件进行操作,可能会希望保存相应的错误。下面就是一个这样的例子,这一次错误被保存到 g r e p . e r r文件中:

Linux shell编程 13标准输入、输出及文件重定向

还可以把错误追加到一个文件中。在使用一组命令完成同一个任务时,这种方法非常有用。在下面的例子中,两个 g r e p命令把错误都输出到同一个文件中;由于我们使用了 > >符号进行追加,后面一个命令的错误 (如果有的话)不会覆盖前一个命令的错误。

Linux shell编程 13标准输入、输出及文件重定向

5.8 结合使用标准输出和标准错误

一个快速发现错误的方法就是,先将输出重定向到一个文件中,然后再把标准错误重定向到另外一个文件中。下面给出一个例子:

我有两个审计文件,其中一个的确存在,而且包含一些信息,而另一个由于某种原因已经不存在了(但我不知道 )。我想把这两个文件合并到 a c c o u n t s . o u t文件中。

$ cat account_qtr.doc account_end.doc 1>accounts.out 2>accounts.err

现在如果出现了错误,相应的错误将会保存在 a c c o u n t s . e r r文件中。

Linux shell编程 13标准输入、输出及文件重定向

我事先并不知道是否存在 a c c o u n t _ e n d . d o c文件,使用上面的方法能够快速发现其中的错误。

5.9 合并标准输出和标准错误

在合并标准输出和标准错误的时候,切记 s h e l l是从左至右分析相应的命令的。下面给出一个例子:

$ cleanup >cleanup.out 2>&1

在上面的例子中,我们将 c l e a n u p脚本的输出重定向到 c l e a n u p . o u t文件中,而且其错误也被重定向到相同的文件中。

$ grep "standard"* > grep.out 2>&1

在上面的例子中, g r e p命令的标准输出和标准错误都被重定向到 g r e p . o u t文件中。你在使用前面提到的“此处”文挡时,有可能需要把所有的输出都保存到一个文件中,这样万一出现了错误,就能够被记录下来。通过使用 2 > & 1就可以做到这一点,下面给出一个例子:

Linux shell编程 13标准输入、输出及文件重定向

上面的例子演示了如何把所有的输出捕捉到一个文件中。在使用 c a t命令的时候,这可能没什么用处,不过如果你使用“此处”文挡连接一个数据库管理系统 (例如使用 i s q l连接s y b a s e )或使用f t p,这一点就变得非常重要了,因为这样就可以捕捉到所有的错误,以免这些错误在屏幕上一闪而过,特别是在你不在的时候。

5.10 exec

e x e c命令可以用来替代当前 s h e l l;换句话说,并没有启动子 s h e l l。使用这一命令时任何现有环境都将会被清除,并重新启动一个 s h e l l。它的一般形式为:

exec command

其中的c o m m a n d通常是一个s h e l l脚本。

我所能够想像得出的描述 e x e c命令最贴切的说法就是:它践踏了你当前的 s h e l l。

当这个脚本结束时,相应的会话可能就结束了。 e x e c命令的一个常见用法就是在用户的. p r o f i l e最后执行时,用它来执行一些用于增强安全性的脚本。如果用户的输入无效,该s h e l l将被关闭,然后重新回到登录提示符。 e x e c还常常被用来通过文件描述符打开文件。

记住, e x e c在对文件描述符进行操作的时候(也只有在这时),它不会覆盖你当前的s h e l l。

5.11 使用文件描述符

可以使用 e x e c命令通过文件描述符打开和关闭文件。在下面的例子中,我选用了文件描述符4,实际上我可以在 4到9之间任意选择一个数字。下面的脚本只是从 s t o c k . t x t文件中读了两行,然后把这两行回显出来。

该脚本的第一行把文件描述符 4指定为标准输入,然后打开 s t o c k . t x t文件。接下来两行的作用是读入了两行文本。接着,作为标准输入的文件描述符 4被关闭。最后, l i n e 1和l i n e 2两个变量所含有的内容被回显到屏幕上。

Linux shell编程 13标准输入、输出及文件重定向

上面是一个关于文件描述符应用的简单例子。它看起来没有什么用处。在以后讲解循环的时候,将会给出一个用文件描述符代替 c p命令拷贝文本文件的例子。

相关阅读

关键词不能为空
极力推荐

电脑蓝屏_电脑怎么了_win7问题_win10问题_设置问题_文件问题_上犹电脑信息网

关于我们