初学Linux之标准 I/O 和管道

前面我们已经了解了文件系统的部分内容,我们可以通过 ls 命令让当前目录下的内容都显示在屏幕上,也可以使用 pwd 命令,显示当前的所在的目录路径。但是我们输入的是命令,本身并没有输入“显示”这类命令和要求,但是系统就自动的在屏幕上输出我们命令指定的信息。由此可以想象到,系统自身有默认的一种输出方式,同时,有输出就有输入,当输入的和系统无关,系统也会自动提示错误,以上就是我们接下来要了解的基础内容——标准 I/O。具体的涉及内容包括:三种 I/O 设备,把 I/O 重定向入文件,tr 命令的使用,使用管道链接命令。

初学Linux之标准 I/O 和管道

通常对于程序来讲,输入输出数据的可以是键盘、鼠标、显示器等设备。但是我们输入的是命令,本身并没有输入“显示”这类命令和要求,但是系统就自动的在屏幕上输出我们命令指定的信息。系统本身默认对一些命令的输出进行了规范,这样也是减少了我们在使用Linux 过程中对输出的考虑,简化了不必要的繁琐的操作。对于这些默认的输入和输出,我们需要进行了解,这样对后面的程序学习以及脚本编辑都很有帮助。

一、三种标准 I/O

程序一般包括指令和数据,读入数据就是 Input ,输出数据是 Output ,在Linux中,一切皆文件,系统不会识别到具体的文件名,它是通过文件的(fd)文件描述符(数字代号)识别的,若是把键盘和屏幕都是作为文件,那么它们的 fd 是多少呢?下图我们通过一个已经打开的进程(7525),从进程中显示的三个编号分别为0、1、2,这三个编号就分别是系统对键盘输入,屏幕输出,屏幕报错的fd 。

这三个是系统默认的,我们将它们归为:标准输入(0),标准输出(1),标准错误输出(2)。很多命令在屏幕端显示的,都是标准输出。而一些在命令输入完成,回车运行过程中,要求我们使用键盘输入的,就是标准输入。比如 ls 在屏幕列出的文件和目录序列, cat 命令在运行过程中,我们在键盘输入的单词。当我们的输入不符合规范,或者程序运行出现中断,程序需要将错误的内容突出反馈给用户,在屏幕显示的就是标准错误输出。

捕获3    捕获4

二、把 I/O 重定向入文件

重定向是指将原先的输入方向更改到其他的,比如从原先从键盘输入的,我们可以更换到其他方式,原先从从屏幕输出显示的,我们输出到其他位置。

首选的重定向方式是—输出重定向到文件。具体的操作方法是“完整命令      操作符号    文件名”。支持的操作符号包括:  >  把标准输出重定向到文件; 2>  把标准错误输出重定向到文件; &>  把两种输出一起重定向到文件 。三种都使用到了 “ > ”这个大于符号,这个符号是比较随意的符号,每次会将后面跟着的文件内容进行覆盖,对记录整体的数据是不好处理的,此时可以使用 set -C  禁止覆盖,set +C 恢复覆盖。在禁止覆盖的情况下,可以使用 “ >|” 这个符号,同同样实现覆盖,而“ >> ”双大于号是追加的,不是覆盖,禁止覆盖是没有关系的,可以使用“ >> ” , “ 2>> ” , “ &>> ”

捕获5               捕获6

命令同时具备标准输出和标准错误输出的,可以使用下面的方法:COMMAND  > /PATH/FILE1  2> /PATH/FILE2 ,实现标准输出和错误输出重定向到不同的文件位置。另外这边需要提及的是:&> ,&>> 并不是对所有版本的Linux系统适用的,若是不能使用,可以在重定向的末尾 加上 2>&1 ,同样实现标准输出和错误输出重定向到同一个位置。例如:COMMAND >>/PATH/FIEL  2>&1 。

当多个程序的一起运行时,可以使用括号括起来,各个程序分号隔开,之后一起重定向到同一个位置。 ( COMMAND 1 ; COMMAND2 ; COMMAND3 ) >FILE.TXT

捕获7   捕获8  捕获9         以上是将输出重定向,对应的,我们可以将标准输入重定向。和标准输出使用“ > ”类似,标准输入使用的是“ < ”。cat 命令本身是同时有标准输出和标准输入的。标准输入重定向的用法就是在命令的后面加上“ < FILE ” 。 捕获1    之前的f1文件里的信息是123,f2文件里的信息是456。示例中就用f2文件中的内容代替了cat命令的键盘输入。

以上是将标准输入重定向到文件的方法,还有这种多行重定向的方法,使用的符号是 “ <<终止词 ” ,位置也是在命令的后面。但是要使用终止词在符号后面。

捕获4

三、tr 命令的使用

上面我们使用的都是 cat 这个命令,和 cat 一样包括标准输入和标准输出的命令还有很多,tr 命令就是其中之一,这个命令有字符处理的功能,这里可以着重了解一下。

tr 转换和删除字符

tr [OPTION]… SET1 [SET2]

常用的选项:  -c –C –complement:取字符集的补集

-d –delete:删除所有属于第一字符集的字符

-s –squeeze-repeats:把连续重复的字符以单独一个字符表示

-t –truncate-set1:将第一个字符集对应字符转化为第二字符集 对应的字符

捕获2

四、使用管道链接命令

现实生活中的管道是头尾衔接,传递物体流的设备,在Linux中,将数据作为一种“流”,通过管道连接的命令,就可以将“数据流” 前后传递。Linux中的管道在命令中间用“ | ”表示。命令1 | 命令2 |命令3 |….. 管道将命令1的标准输出发送给命令2的标准输入,命令2的标准输出作为命令3的标准输入,如此反复。标准错误输出是无法通过管道传递的。可以利用 2>&1 | 或者 |& 。

捕获5

当管道传递的数据不是标准输出,而是文件,那么不能作为标准输入传递给下一个命令,则可以使用管道中的 “ – ” 符号代替产生的文件,在管道前,作为输出的文件,在管道后,作为输入文件。

tar -cvf   –  /home   | tar  -xvf  –

另外,管道后面的命令,参数是多个,而管道前的标准输出是一串数据流,可以使用 | xargs 命令,将数据流中的空格隔开的数据,分成多个参数,一个个传递给管道后的命令处理。

捕获6

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/89183

(1)
hack王和juhack王和ju
上一篇 2017-12-02 16:08
下一篇 2017-12-02 19:49

相关推荐

  • IP命令

    IP命令 ip命令是Linux下较新的功能强大的网络配置工具。 1 功能 ip命令用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道。 2用法 Usage: ip [ OPTIONS ] OBJECT { COMMAND | help } ip [ -force ] -batch filename -force:不要终止批处理模式中的错误 -b:-…

    Linux干货 2017-05-07
  • shell脚本中if与case使用,查找文件locate与find的使用,压缩,解压及归档工具

    shell脚本中if与case使用 查找文件locate与find的使用 压缩,解压及归档工具 执行的循序  顺序执行  选择执行  循环执行 条件语句if if只是一个有含义的词,不能单独作为指令使用。 单分支      if 条件判断:then       &nbs…

    Linux干货 2016-08-18
  • shell脚本之 select 循环菜单及 函数

    select 循环与菜单 select variable in list    do      循环体命令   done select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入 用户输入菜单列表中的某个数字,执行相应的命令…

    Linux干货 2016-08-22
  • 软件包管理

    软件运行环境 ABI(应用程序的二进制接口):Application Binary Interface Windows 与Linux 不兼容 ELF(Executable and Linkable Format)           —&…

    Linux干货 2017-04-23
  • linux 网络管理命令 SS的使用详则

    SS命令 ss命令用来显示处于活动状态的套接字信息,ss迷路可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCO和连接状态信息,而且比netstat更快速更高效。 当服务器的socket连接数量变得非常大时,无论是使用netest命令还是直接  cat/proc/net/tcp 。…

    2017-08-19
  • Btrfs文件系统的管理和应用

        Btrfs(我们称之为Butter FS或者B-tree FS)被称为新一代的linux文件系统。一直以来,EXT文件系统以其卓越的稳定性成为linux标准的文件系统。但近年来,EXT3暴露出一些扩展性的问题(如单一文件大小限制、总文件系统大小限制等),于是便催生了EXT4。但同时,Btrfs向人们展现出诸多优…

    Linux干货 2016-02-14