Shell—— 10.重定向

标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)的文件描述符分别是0、1和2。
标准输入:/dev/stdin、 0 、<(没有包含<<符号)
标准输出 :/dev/stdout、1、>或>>
标准错误:/dev/stderr 、2、 >或>>
使用"-“也表示/dev/stdin
[root@master ~]# cat /etc/fstab | cat -
脚本中常见2>&1和&>以及&>>的符号,表示将stdout和stderr都重定向到同一个地方去,即重定向所有输出内容,”&> /dev/null"。
重定向操作是shell最先解析到的,在执行命令之前,重定向就会先打开文件以确定输入、输出的位置。如果是重定向输出操作,则先截断文件使其为空。
/dev/stdin、/dev/stdout、/dev/stderr等设备只是数据默认的流向目标(严格地说是文件描述符0、1、2的输出目标),它们不等价于"标准输入0、标准输出1、标准错误2"。之所以称为"重定向",就是将数据的流向改变,不再输入到这些默认设备中。
ls / >file1 2>&1 表示先打开file1作为标准输出(fd=1)的目的地,然后再将标准错误绑定到标准输出(已经是file1)上,这样无论是标准错误还是标准输出都重定向到file1中。它等价于 ls / &>file1 。"&"符号表示描述符重用(fd 2 duplicate from fd 1)。将其理解为文件描述符2复制了文件描述符1,或者文件描述2重用文件描述符1,使得fd=2也指向了fd=1所指向的文件。
ls / 2>&1 >file1 表示先将标准错误指向到标准输出,此时标准输出还是/dev/sdtout(即屏幕),因此标准错误的输出目标是/dev/stdout(屏幕)。之后再打开file1作为标准输出的目标。因此,它最终将标准错误重定向到/dev/stdout,将标准输出重定向到file1。可以让ls命令产生错误来测试, ls dlfjasl 2>&1 >file1 ,结果将直接显示在屏幕上。
将stdout或stderr丢到/dev/null表示丢弃输出信息,反过来,将/dev/null重定向到某个文件则表示清空文件。

[root@master ~]# cat /dev/null > ab.sh
快速清空文件
[root@master ~]# > ab.sh
[root@master ~]# : > ab.sh # 或"true >ab.sh",其实它们都等价于">ab.sh"
[root@master ~]# echo ‘’ > ab.sh
[root@master ~]# truncate -s 0 ab.sh # truncate命令用于收缩和扩展文件大小
[root@master ~]# dd if=/dev/null of=ab.sh

在有输出类的重定向(包括错误重定向)语句中,命令执行之前就已经将文件截断为0大小。所以如果正在编辑一个文件并将编辑的结果重定向回这个文件将出现异常,因为截断后就没有合适的内容用于编辑。
[root@master ~]# head a.log > a.log
有些时候直接使用">"覆盖输出是比较危险的。可以使用set -C来设置如果输出重定向文件已经存在则不覆盖。使用set +C来取消set -C的效果。如果在设置了set -C时仍然想强制覆盖,可以使用“>|”代替“>”来重定向输出。同理错误输出也有此特性。
[root@master tmp]# set -C
[root@master tmp]# cat flip >ttt.txt
-bash: ttt.txt: cannot overwrite existing file
[root@master tmp]# cat flip >| ttt.txt
[root@master tmp]# set +C
————Blueicex 2020/03/07 21:37 blueice1980@126.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值