bash参考手册之三(基本的Shell特性)续八

3.6 重定向

在一个命令被执行前,可能会使用一个特殊的符号,重定向它的输入和输出。重定向也可以用来在当前shell执行环境中打开和关闭文件。下面的重定向操作符可以出现在一个简单的命令之前或命令中,或出现在命令之后。重定向由左到右,按照出现的顺序处理。
每个重定向之前可能有一个文件描述符号码,也可能是这种形式{varname}。在这种情况下,对于每个重定向操作符,除>&-和 <&-以外 ,shell将分配一个大于10的文件描述符给{varname}。如果>&-或者<&-前面是{varname},则varname的值定义了要关闭的文件描述符。
在以下描述中,如果文件描述符号码被省略,并且重定向操作符的第一个字符是“<”,则重定向指向的是标准输入(文件描述符0)。如果重定向操作符的第一个字符是'>',重定向指向的是标准输出(文件描述符1)。
在下面的描述中,除非另有说明,重定向操作符之后的单词,要执行大括号扩展,波浪线扩展,参数扩展,命令替换,算术扩展,引号移除,文件名扩展,和单词分割。如果扩展结果多于一个单词,则Bash会报告一个错误。
需要注意的是重定向的顺序是很重要的。例如,命令

ls > dirlist 2>&1

表明把标准输出(文件描述符1)和标准错误(文件描述符2)重定向到文件 dirlist,而命令

ls 2>&1 > dirlist

表明仅仅把标准输出重定向到文件dirlist,因为在标准输出重定向到dirlist之前,标准错误已被作成了标准输出的副本。
Bash在重定向中对几个文件名要作特殊的处理,如下表:
/dev/fd/fd

如果fd是一个合法的整数,文件描述符fd被复制。

/dev/stdin

文件描述符0被复制。

/dev/stdout

文件描述符1被复制。

/dev/stderr

文件描述符2被复制。

/dev/tcp/host/port

如果host是一个有效的主机名或Internet地址,并且port是一个整数端口号或服务名,Bash试图打开一个到相应socket的TCP连接。

/dev/udp/host/port

如果host是一个有效的主机名或Internet地址,并且port是一个整数端口号或服务名,Bash试图打开一个到相应socket的UDP连接。

打开或创建一个文件失败,造成重定向失败。
在重定向时,应谨慎使用大于9的文件描述符,因为它们可能和shell使用的文件描述符冲突。


3.6.1 输入重定向

输入重定向是,以表达式word被扩展的结果字符串为名字的文件被打开,以准备从文件描述符n读出,或如果没有指定n,则准备从标准输入(文件描述符0)读出。
输入重定向的一般格式是:

[n]<word


3.6.2 输出重定向

输出重定向是,以表达式word被扩展的结果字符串为名字的文件被打开,以接受从文件描述符n的写入,或如果没有指定n,则接受从标准输出(文件描述符1)的写入。
输出重定向的一般格式是:

[n]>[|]word

如果重定向操作符是'>',内建命令setnoclobber选项已启用,那么,如果表达式word被扩展的结果字符串为名字的文件存在并且是一个普通文件,则重定向失败。如果重定向操作符是'>|',或重定向操作符是'>',并且noclobber选项是未启用的,即使以word命名的文件存在,也试图重定向。


3.6.3 追加输出重定向

以这种方式输出重定向,以表达式word被扩展的结果字符串为名字的文件以追加方式被打开,以接受从文件描述符n的写入,或如果没有指定n,则接受从标准输出(文件描述符1)的写入。如果该文件不存在,则创建它。
追加输出重定向的一般格式是:

[n]>>word


3.6.4 标准输出和标准错误重定向

这种结构可以把标准输出(文件描述符1)和标准错误输出(文件描述符2)重定向到word扩展结果字符串为文件名的文件中。
标准输出和标准错误重定向的格式有两种:

&>word

>&word

两种形式中,常用第一种。这种方式在语义上等同于

>word 2>&1


3.6.5 追加标准输出和标准错误

这种结构可以把标准输出(文件描述符1)和标准错误输出(文件描述符2)以追加方式重定向到word扩展结果字符串为文件名的文件中。
追加标准输出和标准错误重定向的格式是:

&>>word

这在语义上等同于

>>word 2>&1


3.6.6 Here文档(即时文档)

这种类型的重定向,指示shell从当前的源读取输入,直到读到仅仅包含word(没有尾随空白)的行为止。所有在那一点前读入的行,作为命令的标准输入。
Here文档的格式是:

<<[-]word

here-document

delimiter

word上不执行参数​​扩展,命令替换,算术扩展,文件名扩展。如果word中任何字符被引号包含,delimiter是在word上作引号移除得到的结果,而here-document中的行不会被扩展。如果word没有引号,here-document的所有的行都是参数扩展,命令替换和算术扩展的对象。在后一种情况下,字符序列\newline将被忽略,并且'\'必须被用来引用字符'\','$',和'`'。
如果重定向操作符是'<<-',那么所有输入行和包含delimiter的行的开头的制表符被去除。这使得here文档在shell脚本文件中以自然方式缩进。


3.6.7 Here字符串(即时字符串)

这里的一个here文档的变种,其格式为:

<<< word

word被扩展并且作为命令的标准输入。


3.6.8 复制文件描述符

重定向操作符

[n]<&word

用于复制输入文件描述符。如果word扩展为一个或多个数字,n表示的文件描述符将成为该文件描述符的副本。如果word中的数字不指向一个输入文件描述符,会产生重定向错误。如果word的结果为‘-’,则关闭文件描述符n。如果n未指定,则使用标准输入(文件描述符0)。
操作符

[n]>&word

和复制输出文件描述符类似。如果n没有指定,则使用标准输出(文件描述符1)。如果word中的数字不指向一个输出文件描述符,会产生重定向错误。作为一个特殊情况,如果n被省略,并且word没有扩展到1个或多个数字,标准输出和标准错误将如前所述被重定向。


3.6.9 移动文件描述符

重定向操作符

[n]<&digit-

移动文件描述符digit到文件描述符n,或,如果未指定n,则移动到标准输入(文件描述符0)。digit被复制到n后,就被关闭。
同样的,重定向操作符

[n]>&digit-

移动文件描述符digit到文件描述符n,或,如果未指定n,则移动到标准输出(文件描述符1)。


3.6.10 打开文件描述符以读和写

重定向操作符

[n]<>word

使名称是word扩展结果的文件被打开,以准备从文件描述符n读取和写入,如果未指定n,则使用文件描述符0。如果该文件不存在,则创建它。



原文链接:http://www.gnu.org/software/bash/manual/bash.html#Redirections


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值