IO重定向

1. 文件输入重定向
[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


例子:

从文件读取数据重定向到另一文件

测试数据,就两行数据

[root@hadoop ~]# cat test.txt
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},当使用前者的时候后一行并不会把前一行的数据覆盖。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值