Linux shell编程:管道和重定向

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux shell编程:管道和重定向相关的知识,希望对你有一定的参考价值。

标准输入输出

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

标准输入输出描述符

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

管道

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

管道格式

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

通过管道,一个命令的输出可以作为另一个命令的输入。

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

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

# 例如:
[[email protected] ~]# 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
[[email protected] ~]# 

输入输出重定向

输入重定向

输入重定向使用符号”<"来完成
命令 << 分界符 # 标准输入中读入,直到遇见分界符 才停止 一般分界符用EOF

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

here-documents

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

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

技术分享图片

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

Here Strings

# here strings格式:
    <<< WORD

# 例如:

技术分享图片

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

# 如:
[[email protected] ~]# 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(,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()
[[email protected] ~]# 

输出重定向

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

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

技术分享图片

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

技术分享图片

错误重定向

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

# 例如
# 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

技术分享图片

技术分享图片

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

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

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

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

技术分享图片

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

技术分享图片

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

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

以上是关于Linux shell编程:管道和重定向的主要内容,如果未能解决你的问题,请参考以下文章

Linux管道及重定向

Shell编程规范与变量

linux进程管道和重定向

重新点亮shell————管道和重定向[二]

Shell 脚本 - 管道和重定向

4. Linux中的管道和重定向