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

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

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

在上面的例子中,所有的目录名和以 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:

如果想创建一个长度为 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.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变量。

5.7.3 重定向标准错误

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

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文件中:

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

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文件中。

我事先并不知道是否存在 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就可以做到这一点,下面给出一个例子:

上面的例子演示了如何把所有的输出捕捉到一个文件中。在使用 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两个变量所含有的内容被回显到屏幕上。

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

linux shell编程输入输出,Linux shell编程 13标准输入、输出及文件重定向-dps文件怎么打开...相关推荐

  1. linux实现标准设备输入输出,Linux的标准输入和输出

    设备 设备文件名 文件描述符 类型 键盘 /dev/stdin 0 标准输入 显示器 /dev/sdtout 1 标准输出 显示器 /dev/sdterr 2 错误标准输出 1.命令 > 文件 ...

  2. 报错笔记:linux 命令行中的print输出内容无法重定向到文件中

    在命令行上跑一个python程序(执行时间很长),如果将输出直接重定向到命令行上,是会有输出的 但是如果我们将其重定向到一个文件中,可能很久都没有输出 原因在于python是有缓存输出的,所以不能暂时 ...

  3. 嵌入式Linux开发教程:Linux常见命令(上篇)

    摘要:这是对周立功编著的<嵌入式Linux开发教程>的第7期连载.本期刊载内容有关LinuxLinux常见命令中的导航命令.目录命令和文件命令.下一期将连载网络操作命令.安装卸载文件系统等 ...

  4. linux 读取命令行输入,Linux read命令的使用

    1.命令简介 read命令是Shell内建命令,用于从标准输入或-u选项指定的文件描述符中读取单行,并将读取的单行根据IFS变量分割成多个字段,并将分割后的字段分别赋值给指定的变量列表var_name ...

  5. linux 脚本编写基本命令,Linux Shell命令行及脚本编程实例详解

    <Linux典藏大系:Linux Shell命令行及脚本编程实例详解>共15章,分为两篇.主要内容包括:Linux 及Linux Shell简介.初识Linux Shell.常用Shell ...

  6. linux 运维高级脚本生成器,Linux运维系列,Shell高级脚本自动化编程实战

    课程文件目录: Linux自动化运维系列 Shell高级脚本自动化编程实战 [6.1G] ┣━━01.Shell基础概述 [315.1M] ┃ ┣━━1-1 Shell脚本体系概述.mp4 [154. ...

  7. linux shell命令行及脚本编程实例详解_超全整理!这些Shell编程必备知识你都掌握了吗?...

    正文最近很多粉丝咨询我,被问到了一些Shell编程的问题,看看大家能否答出来: 1.shell脚本千千万,不知道从哪入手 2.没经验缺方法,面试通不过.做事没头绪 3.野路子.没人教自动化,做了几年基 ...

  8. linux shell编程 ppt,Linux常用命令与Shell基本编程.ppt

    Linux常用命令与Shell基本编程.ppt Shell 脚本基本编程,无线产品部 katanazhang 2009-11-09,课程目标,linux 常用命令 shell 脚本编程 awk 的用法 ...

  9. linux系统默认的环境变量path,Linux编程 12 (默认shell环境变量, PATH变量重要讲解)...

    一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash  shell支持的Bourne变量 Bo ...

最新文章

  1. 每天一个linux命令(7):mv命令
  2. Android Studio如何发布APK
  3. itchat群机器人的自动画实现
  4. 熟悉 Linux 系统结构,推开Linux 大门
  5. 机器人学习--Carnegie Mellon University 认知机器人学课程
  6. Android震动vibrator系统开发全过程
  7. Spring Cloud教程–使用Spring Cloud Bus自动刷新配置更改
  8. python bp神经网络分类预测结果图_深度学习入门(四)BP神经网络——数字分类...
  9. mysql每一行数据类型_MySQL_MySQL编程中的6个实用技巧,每一行命令都是用分号(;)作为 - phpStudy...
  10. 选择物联网卡平台时需要重点考虑的标准
  11. [原]tornado 源码分析系列目录
  12. ps mysql进程_ps(Process Status)进程状态:列出当前正在运行的进程
  13. 【校内模拟】2048
  14. java游戏编程源代码_JAVA小游戏编程-源代码
  15. win10隐藏桌面功能
  16. caffe 安装方法(python)
  17. 偏最小二乘法PLS和PLS回归的介绍及其实现方法
  18. Python分析成绩
  19. 临时码农敲门砖 有效 2022-10-16 (详情 见文末)
  20. Android中实现红绿灯动画,android红绿灯制作

热门文章

  1. Java面试宝典2013版(超长版)
  2. 【100%通过率】华为OD机试真题 Java 实现【真正的密码】【2022.11 Q4 新题】
  3. 苹果App,不用上传苹果商店,也能让其他人安装
  4. 做集成墙板,只有选对厂家,才能选对品牌
  5. 凌玮科技将在创业板上市:预计募资净额约8亿元,曾踩雷民生理财
  6. python 文件管理器
  7. 什么是生成性学习?机器不会之
  8. 如何清空StringBuilder
  9. win10新无线网无法连接服务器,Win8无线网络无法连接怎么办?
  10. 在vue中使用flexible---移动端适配