shell脚本系列:7、重定向

shell脚本系列:7、重定向



在执行命令之前,可以使用shell解释的特殊符号重定向其输入和输出。重定向允许复制、打开、关闭命令的文件句柄,使其引用不同的文件,并可以更改命令读取和写入的文件。重定向也可以用于修改当前shell执行环境中的文件句柄。以下重定向操作符可以出现在简单命令的前面或任何位置,也可以跟随在命令之后。重定向是按照从左到右的顺序进行处理的。

每一个前面可能有一个文件描述符编号的重定向前面可能会有一个形式为{varname}的单词。在这种情况下,对于除>&-和<&-之外的每个重定向操作符,shell将分配一个大于10的文件描述符,并将其分配给{varname}。如果>&-或<&-前面有{varname}, varname的值定义了关闭的文件描述符。如果提供了{varname},该重定向将在该命令范围之外持续,允许shell程序员手动管理文件描述符的生命周期。

在以下描述,如果省略文件描述符数量,和重定向操作符的第一个字符“<”,重定向是指标准输入(文件描述符0)。如果重定向操作符的第一个字符是“>”,重定向是指标准输出(文件描述符1)。

除非另有说明,以下描述中重定向操作符后面的词必须进行大括号展开、波浪号展开、参数展开、命令替换、算术展开、删除引号、文件名展开和分词。如果扩展到多个单词,Bash将报告一个错误。

注意,重定向的顺序很重要。例如,命令:

ls > dirlist 2>&1

将标准输出(文件描述符1)和标准错误(文件描述符2)指向文件目录列表,而命令:

ls 2>&1 > dirlist

只将标准输出定向到文件目录列表,因为在标准输出被重定向到目录列表之前,标准错误是标准输出的副本。

Bash在重定向中特别处理几个文件名,如下表所述。如果运行Bash的操作系统提供了这些特殊文件,Bash将使用它们;否则,它将使用下面描述的行为在内部模仿它们。

/dev/fd/fd

如果fd是一个有效的整数,则文件描述符fd是重复的。

/dev/stdin

文件描述符0是重复的。

/dev/stdout

文件描述符1是重复的。

/dev/stderr

文件描述符2是重复的。

/dev/tcp/host/port

如果host是一个有效的主机名或Internet地址,而port是一个整数端口号或服务名,Bash将尝试打开相应的TCP套接字。

/dev/udp/host/port

如果host是一个有效的主机名或Internet地址,而port是一个整数端口号或服务名,Bash将尝试打开相应的UDP套接字。

打开或创建文件失败将导致重定向失败。

使用大于9的文件描述符的重定向应该小心使用,因为它们可能与shell内部使用的文件描述符冲突。

1. 重定向输入

输入的重定向导致其名称来自word扩展的文件在文件描述符n上打开并读取,或者如果n未指定则打开标准输入(文件描述符0)。

重定向输入的一般格式是:

[n]<word

2. 重定向输出

输出重定向导致其名称由word展开而来的文件被打开并写入文件描述符n,或者如果n未指定,则会打开标准输出(文件描述符1)。如果文件不存在,则创建该文件;如果它确实存在,则将其截断为零大小。

重定向输出的一般格式是:

[n]>[|]word

如果重定向操作符是>,并且已经启用了set builtin的noclobber选项,如果其名称由word扩展产生的文件存在并且是一个常规文件,则重定向将失败。如果重定向操作符是>|,或者重定向操作符是>如果没有启用noclobber选项,那么即使以word命名的文件存在,也会尝试重定向。

3. 附加重定向输出

以这种方式重定向输出会导致其名称由word展开而产生的文件被打开并附加到文件描述符n上,或者如果未指定n,则会打开标准输出(文件描述符1)。如果文件不存在,则创建该文件。

附加输出的一般格式是:

[n]>>word

4. 重定向标准输出和标准错误

这个构造允许将标准输出(文件描述符1)和标准错误输出(文件描述符2)重定向到其名称为word展开的文件。

有两种重定向标准输出和标准错误的格式:

&>word

和:

>&word

在这两种形式中,首选第一种。这在语义上等同于

>word 2>&1

当使用第二种形式时,word不能扩展为数字或’ - '。如果是,出于兼容性原因,将应用其他重定向操作符(参见下面的复制文件描述符)。

5. 附加标准输出和标准错误

这个构造允许将标准输出(文件描述符1)和标准错误输出(文件描述符2)附加到名称为word展开的文件中。

附加标准输出和标准错误的格式为:

&>>word

这在语义上等同于

>>word 2>&1

(参见下面复制文件描述符)。

6. here document

他的重定向类型指示shell从当前源读取输入,直到看到只包含单词(末尾没有空格)的行。读取到该点之前的所有行,然后用作命令的标准输入(或文件描述符n,如果指定了n)。

此文件的格式为:

[n]<<[-]word
        here-document
delimiter

对word不执行参数和变量展开、命令替换、算术展开或文件名展开。如果word的任何部分被引用,则分隔符是word上删除引号的结果,并且此处文档中的行不会展开。如果word没有加引号,则here-document中的所有行都将进行参数展开、命令替换和算术展开,字符序列\换行符将被忽略,并且\必须用来引用字符\、$和’。

如果重定向操作符是’ <<- ',则从输入行和包含分隔符的行中去掉所有前导制表符。这允许shell脚本中的here-document以一种自然的方式缩进。

7. here strings

here documents的变体,格式为:

[n]<<< word

这个词经历了波浪号展开、参数和变量展开、命令替换、算术展开和引号删除。不执行文件名扩展和分词。结果以单个字符串的形式提供,并在其标准输入(或文件描述符n,如果指定了n)的命令后面附加一个换行符。

8. 复制文件描述符

重定向操作符

[n]<&word

用于复制输入文件描述符。如果word扩展为一个或多个数字,则n表示的文件描述符将成为该文件描述符的副本。如果word中的数字没有指定打开供输入的文件描述符,则会发生重定向错误。如果word计算值为’ - ',则关闭文件描述符n。如果未指定n,则使用标准输入(文件描述符0)。

操作符:

[n]>&word

类似地用于复制输出文件描述符。如果未指定n,则使用标准输出(文件描述符1)。如果word中的数字没有指定打开用于输出的文件描述符,则会发生重定向错误。如果word计算值为’ - ‘,则关闭文件描述符n。作为一种特殊情况,如果n被省略,并且word没有扩展为一个或多个数字或’ - ',标准输出和标准错误将像前面描述的那样被重定向。

9. 移动文件描述符

重定向操作符

[n]<&digit-

将文件描述符数字移动到文件描述符n,或者如果n未指定则移动标准输入(文件描述符0)。数字复制到n后关闭。

类似地,重定向操作符

[n]>&digit-

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

10. 打开读写的文件描述符

重定向操作符

[n]<>word

导致文件名为word展开名的文件在文件描述符n上打开并同时读写,或者如果n未指定则在文件描述符0上打开。如果文件不存在,则创建该文件。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称系统有问题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值