转向
转向的意思是,原本应由标准输入读取的数据,改由其他文件读取,原本应该把结果显示在标准输入的,改输出到其他文件,在这个过程中,会
涉及到文件代码的概念
文件代码是操作系统赋予已开启文件的一个编号,有0开始,作为追踪文件之用,如对这个文件进行读取或写入的操作,都使用文件代码来沟通
操作系统默认指定3个文件代码,0给标准输入(stdin),1给标准输出(stdout),2给标准错误(stdrerr),这3个文件在建立shell环境
时已经开启,往后如果开启新文件则分配3以上的号码
1:操作文件,
运用转向的概念,开启文件,复制文件和关闭文件

开启文件
exec 5<>test.txt
使用exec执行转向,开启文件test.txt,并指定其文件代码为6

关闭文件,
开启文件后,如果该文件不在使用,最好关闭,教会调用文件嗲吗所占用的系统资源,
exec 6<&-
复制文件代码,建立文件链接
有时候欲操作系统已开启的文件代码0 1 2 ,为了不影响原有文件代码的作用,最好先复制一份,等操作结束,在还原回去,
有一下两种方式
1:复制转向输入的文件代码m,存成文件代码n,使n链接至m:
n<&m
2:复制转向输出的文件代码m,存成文件代码n,使n链接至m:
n>&m
转向的用法
转向输入
语法:fd<文件
使用“文件”做输入,指定它的文件代码
如:
wc -l < /var/log/messages
转向输入后,标准输入和文件messages建立链接,wcgaiyoumessages读取行数,但是wc
不知道它是由哪里取得的数据,但是wc默认就是向标准输入读取数据的
例子2:
exec 6< /var/log/messages
wc -l <&6
解释,使用文件代码6做输入,输入来源是messages
文件代码6供应wc数据行

转向输出
语法:fd>文件
使用文件做输出指定她的文件代码为fd
如果文件不存在,会连理一个新文件,如果存在,则该文件内容会被清空,
如果这样危险,可使用set -o noclobber来关闭覆盖文件的默认操作
set -C效果一样
例子:
> test.c 开启空文件 test.c
: > test.c ,:为bash的空命令,什么也不做,转向输出的效果产生空文件
存储命令执行的输出
例子:
ls > ls.txt

例子2:
exec 6> test.txt
echo 'hello world' 1>&6



fd>|文件
同> ;但>|不会理会noclobber选项,只要文件存在,都会强制覆盖,清空改文件内容
如:
set -o noclobber

[root@centos129 tmp]# ls > ls.txt
-bash: ls.txt: cannot overwrite existing file

[root@centos129 tmp]# ls >| ls.txt
[root@centos129 tmp]# tail ls.txt
mapping-root
MySQL-5.5.20-1.linux2.6.x86_64.tar.1
开启noclobber选项,无法覆盖ls.txt,但>|可以
转向附加
fd>>文件
如果文件存在,吧输出写在文件的后面,不清空文件
ls >> ls.txt

标准错误伴随标注输出做转向
语法:
&>文件

>&文件
例子:
netdate 192.168.1.1 &> /dev/null
更新时间,转向输出至/dev/null。null,可以理解为linux的黑洞,所有信息均输出到/dev/null
ntpdate 192.168.1.1 &> /dev/null                      
[root@centos129 tmp]# ntpdate 192.168.1.1
21 Feb 12:10:08 ntpdate[5730]: no server suitable for synchronization found 

here Document转向
除了可以把标记之间的内容,利用转向输入的方式交给指定的命令去处理之外,也可以供应给开启的文件读取,
语法:
fd<<标记
资料
。。。。
。。。。
。。。。
。。。。
标记
如:
exec 6<<ENDF
1
2
3
4
5
6
ENDF
while read <&6
do
echo $REPLY
done
例子2:
cat > /etc/rsyncd.secrets <<END
BackupUser:bfa994f3dab8ec2eae10362d592b9725
END