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在内部使用的文件描述符冲突。

原文地址:http://blog.51cto.com/jlnetc/2082993

时间: 2024-11-06 11:28:33

Linux shell编程(三):管道和重定向的相关文章

linux shell编程(三) if 和 for

if 条件判断: 单分支的if语句if 判断条件: then statement1fi双分支的if语句if 判断条件;then statement1 statementelse statement3fi多分支的if语句if 判断条件1:then statement1 elif 判断条件2:then statement2 elif 判断条件3:then statement3 else statement4fi for循环for 变量 in 列表;do 循环体 done

Linux Shell编程三

case分支条件语句. case "string" in pattern_1) commands ;; pattern_2) commands ;; *) commands ;; esac 当条件语句中的string等于patern字符串时执行pattern下面命令. 当没有符合条件时,最后执行*). ";;"相当于switch语句中的break关键字,不加";;"会报错.

Linux Shell 编程实战技巧

目前,越来越多的企业应用会部署在 Linux 系统上的,而 Linux Shell 脚本可以极大地帮助我们完成这些应用的运维任务.这使得 Linux Shell 开发技能成为开发人员的一项重要的.有竞争力的技能.本文就笔者的实际开发经验,以 Korn Shell 为例分享了脚本开发中的常见问题及相关技巧. 避免定时任务脚本的常见问题 很多脚本在实际使用的时候往往是以定时任务的方式运行,而非手工运行.但是实现同样功能的脚本在这两种运行方式下可能遇到的问题不尽相同. 以定时任务方式运行的脚本往往会遇

Linux Shell编程之二选择结构

Shell编程学习之二 一.bash的条件测试 测试方法或者说测试书写: test EXPR [ EXPR ] [[ EXPR ]] 例如:测试变量 User_Name 的之是否为root test $User_Name="root" [ $User_Name == "root" ] [[ $User_Name == "root" ] 根据比较时操作数的类型,测试类型分为: 测试类型 运算符 运算符所代表的意义 示例 整形测试 -gt -lt -

linux系统编程之管道(一):匿名管道(pipe)

原文地址:http://www.cnblogs.com/mickole/p/3192210.html 一,什么是管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中. 数据的读

Linux Shell编程之五字符串的处理

shell编程之字符串处理 在 shell 中,由于是一种弱类型的语言,在没有事先申明变量类型的情况下,所有的变量都是字符串.所以对字符串的处理就显得相当重要了. 下面介绍常见的对字符串处理的操作. 一.字符串切片 ${string_var:offest:length},类似于数组元素的提取. # 这里的string_var是一个变量,offest 是字符串的开始偏移量,length是切去字符串的长度 var=dhcpd:x:177:177:DHCP server:/:/sbin/nologin

关于linux shell编程,alias rm=&#39;cp [email&#160;protected] ~/backup; rm [email&#160;protected]&#39;

书上的这个例子需要在ubuntu的低版本的系统才支持,现在基本上都不支持了,想实现也很简单自己写一个脚本先备份再删除. alias也只是做了一次替换alias rm='cp [email protected] ~/backup; rm [email protected]' rm text.txt被转换成了cp  [email protected] ~/backup; rm [email protected] text.txt即cp  ~/backup; rm  text.txt可以看到text.

京峰Linux Shell编程从入门到精通

课程介绍:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. -------------------课程目录------------------- <Shell编程从入门到精通> ├1.linux下shell编程基础入门_(new).mp4├2.Shell编程之变量及LAMP导航菜单编写_(new).mp4├3.Shell编程之IF条件语句各种案例演练_(new).mp4├4.使用if条件语句编写MySQL备份脚本_(new).mp4

Linux Shell编程基础

在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐藏  -R 显示文件夹内的内容  -c 按照最后一次修改时间排序  -t 按照修改时间排序输出 echo 显示  -n 不换行 touch  创建一个文件,或者修改文件的访问时间和修改时间 touch -a file 只更改访问时间 -m之更改修改实际那 -t指定特定时间 cp  复制文件 -a 保

Linux Shell编程入门

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用.深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh).Bourne