【解释】
重定向: 是动作,一种操作的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
1
2
3
4
5
|
#/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: 脚本中文件作为重定向输入
1
2
3
4
5
|
#/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在循环读取文件中的一下行.....
等价于
1
2
3
4
|
#/bin/bash
cat
/etc/issue
|
while
read
line;
do
echo
$line
done
|
例子3: 关闭打开的文件描述符
1
2
3
4
5
|
#/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执行一个脚本有何不同?
看下篇。