Linux shell编程(三):管道和重定向

标准输入输出

执行一个shell命令行时一般会自动打开三个标准文件
即标准输入文件(stdin),一般对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中获得输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。shell

标准输入输出描述符

  • 标准输入(stdin):0
  • 标准输出(stdout):1
  • 标准错误(stderr):2

管道

“管道”是由一个控制操做符 "|" 或 “|&” 分隔的简单命令序列。编程

管道格式

[time [-p]] [!] COMMAND1 [ [| or |&] COMMAND2 ...]

经过管道,一个命令的输出能够做为另外一个命令的输入。bash

管道中的每一个命令的输出经过一个管道链接到下一个命令的输入。也就是说,每一个命令读取前一个命令的输出。此链接在命令指定的任何重定向以前执行。tcp

若是使用“|&”,命令1的标准错误将经过管道链接到COMMAND2的标准输入;它是“2>&1 |”的简写。标准错误的隐式重定向是在命令指定的任何重定向以后执行的。ide

# 例如:
[root@bogon ~]# cat /etc/passwd|gawk -F: '/^r/{print $p}'  # 命令cat的输出经过管道符 | 做为了命令gawk的输入 
root:x:0:0:root:/root:/bin/bash
rjl:x:1000:1000:rjl:/home/rjl:/bin/bash
[root@bogon ~]#

输入输出重定向

输入重定向

输入重定向使用符号”<"来完成
命令 << 分界符 # 标准输入中读入,直到碰见分界符 才中止 通常分界符用EOFthis

命令 < 文件1 > 文件2 #将文件1作为命令的标准输入并将标准输出重定向到文件2,,会清空原来的文件数据spa

here-documents

这种类型的重定向指示shell从当前源读取输入,直到看到只包含单词(没有尾随空格)的行。全部读到该点的行都被用做命令的标准输入。命令行

# here-documents 格式:
     <<[-]WORD
             HERE-DOCUMENT
     DELIMITER
 # 例如:

Linux shell编程(三):管道和重定向

没有参数扩展、命令替换、算术扩展或文件名扩展。若是引用了WORD中的任何字符,则分隔符是在WORD中引用删除的结果,而here文档中的行没有展开。若是单词没有被引用,那么全部的here文档的行都受到参数扩展、命令替换和算术扩展的影响。在后一种状况下,将忽略字符序列'\newline',而'\'必须用于引用字符'\'、'$'和' '。code

Here Strings

# here strings格式:
    <<< WORD

# 例如:

Linux shell编程(三):管道和重定向

WORD被扩展并提供给它的标准输入的命令。blog

# 如:
[root@bogon ~]# cat -n < Html.py  # 查看Html.py文件的内容,通常可省略“<"符号
     1  #coding:utf-8
     2  from HtmlTool.tool.Html import Html
     3  
     4  a=Html("a")
     5  a.setAttribute(href="https://www.baidu.com",title="this is baidu")
     6  p=Html("p")
     7  p.setAttribute(alt="",cls="a b c d e f g")
     8  span=Html("span")
     9  span.setAttribute(cls="a b c d e f g",data="")
    10  p.children(span)
    11  a.children(p)
    12  a.children(span)
    13  print a.toString()
[root@bogon ~]#

输出重定向

输出重定向使用符号" > "来完成,使用标准重定向符号可将命令的标准输出或标准错误写入到某个文件。
当使用单个”>"时,目标文件内容将会被擦除,而后将前面命令的输入写入到目标文件。
当使用两个">"时,即:>> 。目标文件以前的内容不会被擦除,而是将命令的输出追加至目标文件。

# 例如:
# 命令 ls 标准输出信息将会被重定向至文件dir.txt。若是dir.txt不存在,将会被建立。
# 若是dir.txt文件已存在,则其原来的内容将会被替换成ls命令的标准输出。

输出重定向

#  例如:
#  有一个文件名为 dir.txt 的文本文件,它的内容是 1.
#  如今使用两个输出重定向符号“>>” 将ls命令的标准输入追加至dir.txt
#  则 dir.txt 的文件内容变成了 
1
.

Linux shell编程(三):管道和重定向

错误重定向

在默认,使用重定向符号 > 只会将标准输出重定向。而不会将标准错误也重定向。除非显式的指明。

# 例如
# ls 1> dir.txt # 将ls的标准输出重定向至文件dir.txt
# ls 1>> dir.txt # 将ls的标准输出追加至文件dir.txt
# ls a 2 > dir.txt # 将ls的标准错误重定向至文件dir.txt,若是ls没有找到目录a将会报错
# ls a 2 >> dir.txt # 将ls的标准错误追加至文件dir.txt

Linux shell编程(三):管道和重定向

Linux shell编程(三):管道和重定向

将标准错误重定向到标准输出

>默认为标准输出重定向,与 1> 相同

2>&1 标准错误输出 重定向到 标准输出.
&>file 标准输出 和 标准错误输出 都重定向到文件file中

# 例如:
# 将标准输出(文件描述符1)和标准错误(文件描述符2)定向到文件dir.txt。

Linux shell编程(三):管道和重定向

只将标准输出指向文件dir.txt,由于标准错误在标准输出被重定向到dir.txt 以前被复制了标准输出。

Linux shell编程(三):管道和重定向

# Bash在重定向时特别处理多个文件名,以下表所述:
文件 描述
/dev/fd/FD 若是FD是一个有效的整数,那么文件描述符FD将被复制。
/dev/stdin 文件描述符0被复制。
/dev/stdout 文件描述符1被复制。
/dev/stderr 文件描述符2被复制。
/dev/tcp/host/port 若是主机是一个有效的主机名或Internet地址,而端口是一个整数端口号或服务名称,则Bash尝试打开对应的套接字的TCP链接。

打开或建立文件的失败会致使重定向失败。使用大于9的文件描述符的重定向应该当心使用,由于它们可能与shell在内部使用的文件描述符冲突。

相关文章
相关标签/搜索