【解释】

重定向: 是动作,一种操作的action行为

文件描述符: 名词,文件的另一种表示,linux一切皆文件。


【基础重定向形式】

<输入重定向用途星级: **
<<here-document  输入重定向

用途星级: ***

>输出重定向用途星级: *****
>>追加用途星级: *****



一、< 用法: cat 作为代表

cat功能:Concatenate FILE(s), or standard input, to standard output.


1 连接文件,输出到标准输出(即打印到屏幕)

2 标准输入,到标准输出(即打印到屏幕)


cat /etc/issue 等于 cat < /etc/issue 


但是左边用的是cat第一种功能, 右边用的是cat的第二种功能。




二、<< 的用法: 以word开始,以delimiter(和word要一样)结束,中间的就是文档内容了。cat作为代表


<<[-]word

    here-document

delimiter



[root@master std]# cat << EOF

>  i am linux

>  yes.

> EOF

 i am linux

 yes.

[root@master std]


注意:<< 文档here-document作为输入,cat在将here-document输出到屏幕上。


常用:在shell脚本中



三、> 的用法:

1 清空一个文件

> youfile

2 清空文件内容,在把新内容写入

echo "you content" > file.txt



四、>> 追加的用法 把内容追加到文件中


echo "test message" >> /var/log/message



【基础文件描述符形式】


数字代号意义用途
0标准输入 STDIN*****
1标准输出 STDOUT*****
2错误输出 STDERR*****



【文件描述符和重定向的结合】

默认

< 等于 0<  标准输入

> 等于 1>  标注输出重定向


>> 等于1>>  标准输出追加


其他

2> 就只能 2>   错误输出重定向

2>> 就只能 >>  错误输出追加

&> 等于  > file 2>&1 标准输出和错误输出 重定向,只打开了一次文件。

&>> 等于 >> file 2>&1 标准输出和错误输出 追加,只打开了一次文件。



这里有一点需要理解,

为什么是

&>> 等于 >> file 2>&1 而不是 >> file 2>>&1  这个会报错。 

因为开始打开文件file,是追加形式,所以2>&1 就可以表示的是把错误输出到那个文件中即可(文件已已经打开且光标已经在行尾)。


重定向和追加的区别是:第一次打开文件的时候,是否把文件清空,定义光标的开始处。从首行第一个字符开始写入。

方式+写入=结果



分析一下几个echo 

echo "abc" > test.txt

echo "error" >> text.txt

echo "abc" >&2   #这一行表示的是错误输出 等于echo "abc" 1>&2,前面是一个默认简写而已



【自定义文件描述符】

创建自己的重定向,在shell中不局限与 0 1 2 这个三个默认的文件描述符。其实在shell中最多可以有9个打开的文件描述符。其他6个分别是3-8。并且可以当作输入输出重定向都可以。

可以将这些文件描述符中的任意一个分配给一个文件。


例子1:创建输出文件描述符

[root@master std]# cat test.sh 

#/bin/bash
exec 3> file3.txt
echo "first line 1"

echo "first line 3" >&3


注:exec执行将文件描述符3重定向到file3.txt这个文件中。

体会下结果吧

[root@master std]# sh test.sh 

first line 1

[root@master std]# cat file3.txt 

first line 3


例子2: 脚本中文件作为重定向输入

#/bin/bash
exec 0< /etc/issue
while read line; do
    echo $line
done


解释: 将文件/etc/issue 作为0文件描述符的输入。

read line默认为从文件描述符0(键盘)读入,二此时exec已经定义了输入来自/etc/issue文件,所以read 会去读/etc/issue这个文件,把当读取的一行的内容,赋值给line这个变量。while在循环读取文件中的一下行.....


等价于

#/bin/bash
cat /etc/issue |while read line; do
    echo $line
done



例子3: 关闭打开的文件描述符

#/bin/bash
exec 3>> /etc/issue
echo "this is last file" >&3
exec 3>&-
echo "test output" >&3


注意:一旦关闭了文件描述符,就不能在脚本中向它写入任何数据了,否则shell会生成错误消息。

[root@master std]# sh test.sh      

test.sh: line 7: 3: Bad file descriptor




【至此】

你一定会很关系exec这个命令是干嘛的? 和source 和sh执行一个脚本有何不同?

看下篇。