[root@localhost ~]# echo "my name is weihongrao" >name.txt
[root@localhost ~]# echo <name.txt
my name is weihongrao
2. 用户输入重定向
当遇到“end” 输入时将停止输入,这里可以是其他的字符,一旦输入遇到这个字符就会终止输入
[root@localhost ~]# cat <name.txt
my name is weihongrao
[root@localhost ~]# cat <<lastname
> wei
> hong
> rao
> lastname
wei
hong
rao
3. 错误输出重定向
[root@localhost ~]# rm testtttttt 2>> error.log
[root@localhost ~]# cat error.log
rm: cannot remove `testtttttt': No such file or directory
[root@localhost ~]#
注:
0: 标准输入
1:标准输出
2: 标准错误
所以以上2>>为标准错误重定向
4. 同时重定向输入和输出
[root@localhost ~]# cat name.txt
my name is weihongrao
[root@localhost ~]# cat <name.txt >name2.txt
[root@localhost ~]# cat name2.txt
my name is weihongrao
[root@localhost ~]#
补充:
一些其他重定向含义
1. &>file
输入和输出都重定向到文件
2. 另外一种创建空文件的方式
:>file 或者 >file
3. 重定向到变量作为文件名
[root@localhost ~]# cat io.sh
#!/bin/bash
filename=file.txt
echo "my name is wei hong rao">>$filename
[root@localhost ~]# bash io.sh
[root@localhost ~]# cat file.txt
my name is wei hong rao
4. >&j
重定向stdout 到j
所有到stdout的都传送到j
5 [j]<>file 打开file 并且把描述符号j给它,
[root@localhost ~]# echo 12345 > num.txt
[root@localhost ~]# cat num.txt
12345
[root@localhost ~]# exec 3<>num.txt
[root@localhost ~]# read -n 2 <&3
[root@localhost ~]# echo -n 999999 >&3
[root@localhost ~]# exec 3>&-
[root@localhost ~]# cat num.txt
12999999
6 n&-
关闭std n
7 0<&-, <&-
关闭stdin
8 1>&-, >&-
关闭stdout
例子:
从文件读取数据重定向到另一文件
测试数据,就两行数据
my name is weihongrao
my another name is jixianqiuxue
脚本
[root@hadoop ~]# cat io.sh
#!/bin/sh
exec 3<&0
exec 4>&1
exec &>result.txt
exec <test.txt
while read line
do
echo ${line}
done
exec 0<&3 3<&-
exec 1>&4 4>&-
执行脚本
[root@hadoop ~]# bash io.sh
查看结果
[root@hadoop ~]# cat result.txt
my name is weihongrao
my another name is jixianqiuxue
可以看到测试数据中的两行数据都到结果文件中了,代码中使用exec &>result.txt 本以为在代码执行结束之后在result.txt只有最后一行数据,但是两行数据都出来了,将以上代码改成exec &>>result.txt 清空result.txt
[root@hadoop ~]# :>result.txt
重新执行,结果也是两行数据在result.txt中。使用exec &>result.txt 和exec &>>result.txt的区别在于,当多次执行脚本的时候使用前者将会覆盖前一次执行的结果而后者则会追加。奇怪的是在代码中使用echo ${line},当使用前者的时候后一行并不会把前一行的数据覆盖。