shell的重定向

1.输入重定向 <

可以通过 < 操作符来改变命令的标准输出,此时命令将从指定的文件中读取标准输入,如:

2.输出重定向 > , >>,&>

相关资料很多,不多做解释。

在使用这些重定向操作符时,需要注意,一般这些重定向操作符只是用于某条命令(也可以是一组命令,使用 {}来进行命令分组),且重定向的文件描述符一般都是0(标准输入),1(标准输出),2(标准错误),而且重定向的目标只能是文件。但实际上,重定向的操作可以丰富得多:

(1) 可以指定的重定向操作符的文件描述符,如 <filename其实等同于 0<filename ,这个0就是标准输入的文件描述符,这个文件描述符可以被替换成其他的文件描述符

(2) 可以通过重定向操作符  >&,<&来使用文件描述符而不是文件名进行重定向

(3)可以通过 exec 来进行当前进程的永久重定向:

重定向命令

说明
exec n<filename
exec n>filename
exec n<>filename
exec n<&m
exec n>&m
exec n>&-
exec n<&-

在bash中exec n>&m 与 exec n<&m的作用几乎是一样的,与上述表格的描述有所区别,并不存在文件描述符方向的限制。具体的原因可以参考下面的网页

bash - exec n<&m versus exec n>&m -- based on Sobell's Linux book - Stack Overflow

总结一下就是:<& 与 >& 这两个重定向操作符对文件描述符的输入输出方向的要求是POSIX标准明确规定的,且明确说明了输入输出方向不正确会导致错误。但在一些shell中(如bash、dash),也参考了POSIX的标准,但并未明确说明输入输出方向不对会导致错误。且在实践中,这些shell使用exec n<&m 与 exec n>&m的效果是一样的,文件描述符的方向不正确并不会导致错误。但是如果希望代码有更好的可移植性,最好还是遵守POSIX标准。

另外需要注意的是,对于临时重定向来说,当前命令需要操作的文件描述符方向读写方向是不能错的。如 ls 1>&5 ,假如fd 5是一个只读的句柄,那么此时会报错。但是单独执行 exec 1>&5 却并不会报错。

个人猜测这是由于执行 1>&5时,1这个fd并没有的进程来操作它,也就是说此时 它指向输入还是输出fd并不重要,但是临时重定向时,1有明确的进程(ls)来操作它,且这个进行需要输出方向的fd,此时就会发生错误。

另外,在bash中实验有下面的现象:

1. 当fd为1时,>&的操作对象既可以是文件,也可以是文件描述符。当>&后的操作对象为文件时:fd只能为1,即1>&filename 时,等同于 &>filename。 

2. 可以通过 exec 永久的重定向,需要注意 fd2(即标准错误)貌似是指向terminal的交互命令行的,一旦在命令行执行 2>&n,在ternimal上将无法看到命令行和提示信息。但是标准输出还是能正常显示

3. >&可以指向文件,但此时的fd只能时1或为空。若指定fd为1,1>&filename 等同于 1>filename, 若使用其他fd,若2>&filename,则会保错。若fd为空,即 >&filename,此时该命令等同于 <&filename

待补充:

1. Here Documents

Here Documents 也是一种重定向操作,其基本格式为:

cmd  [n]<< delimiter

here-document

delimiter

<<为重定向操作符,<<与<的用法类似,但是<是从文件获取输入,而<<是从当前命令行(或脚本)获取的多行输入,输入为delimiter(分隔符)之间的内容,分隔符的名字可以自定义,但是不能包括空格,最后一个分隔符之前和之后都不能存在空格。与<一样,<<左边的文件描述符可以省略,默认的文件描述符为0,也可以显示的指定其他的文件描述符。

2. Here Strings.

Here Strings的重定向操作与Here Documents十分类似,不同的是Here Strings只会获取一行输入,也不需要分隔符。其基本格式为:

cmd [n]<<< strings

同样的,<<<左边的文件描述符可以省略,默认的文件描述符为0,也可以显示的指定其他的文件描述符。

 从我目前的学习内容来看,Here Documents有3个作用,

1. 可以让方便地标准输入获取多行输入

2. 配合空命令 :进行多行注释

3. 方便地对脚本特定的文件描述符进行输入(即n不为0的情况)

Here Strings可以看作Here Documents的子集,是只有一行的Here Documents且不需要分隔符。当标准输入只需要一行时,使用Here Strings更加方便。另外,Here Strings也可以指定文件描述符。个人的理解认为 Here Documents和Here Strings最大的用处在于无需创建文件就可以进行重定向,上文的重定向操作都是针对文件或者文件描述符的,Here Documents和Here Strings无需创建临时文件,使用起来更加地简单。

另外,可以通过Here Documents生成一些简单的文本文件,而无需打开像vim一类的编辑器,如:

$ cat << delimiter > txt.txt
> your column 1
> your column 2
> delimiter

此文章仅用于学习记录,写得很随意,只是能保证自己看懂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值