shell创建文件并写入内容shell基础知识之stdin,stdout,stderr和⽂件描述符stdin,stdout,stderr
stdin=0
stdout=1
stderr=2
使⽤tee来传递内容,把stdout 作为stdin 传到下个命令
root@172-18-21-195:/tmp/pratice# echo "who is this" | tee - # -相当于传⼊到stdout,所以打印2次
who is this
who is this
root@172-18-21-195:/tmp/pratice# echo "who is this" | tee - | cat -n # cat -n 是显⽰⾏数
1 who is this
2 who is this
把stderr给导⼊指定地⽅
root@172-18-21-195:/tmp/pratice# ls 2>/dev/null 1>/dev/null
root@172-18-21-195:/tmp/pratice# ls && # 可以简写成这样,也可以写成2>&1 这样,⼆选⼀
root@172-18-21-195:/tmp/pratice#
ls: cannot access asdf: No such file or directory
<
1. 将⽂件重定向到命令
借助⼩于号(<),我们可以像使⽤stdin那样从⽂件中读取数据:
$ cmd < file
2. 重定向脚本内部的⽂本块
可以将脚本中的⽂本重定向到⽂件。要想将⼀条警告信息添加到⾃动⽣成的⽂件顶部,可以
使⽤下⾯的代码:
root@172-18-21-195:/tmp/pratice# cat << EOF &
> this is a test
> EOF
root@172-18-21-195:/tmp/pratice#
this is a test
出现在cat &与下⼀个EOF⾏之间的所有⽂本⾏都会被当作stdin数据。
<⽂件的内容显⽰如下:
3. ⾃定义⽂件描述符
⽂件描述符是⼀种⽤于访问⽂件的抽象指⽰器(abstract indicator)。存取⽂件离不开被称为
“⽂件描述符”的特殊数字。 0 、 1 和 2 分别是 stdin 、 stdout 和 stderr 预留的描述符编号。
exec 命令创建全新的⽂件描述符。如果你熟悉其他编程语⾔中的⽂件操作,那么应该对⽂
件打开模式也不陌⽣。常⽤的打开模式有3种。
1. 只读模式。
2. 追加写⼊模式。
3. 截断写⼊模式。
< 操作符可以将⽂件读⼊ stdin 。 > 操作符⽤于截断模式的⽂件写⼊(数据在⽬标⽂件内容被
截断之后写⼊)。 >> 操作符⽤于追加模式的⽂件写⼊(数据被追加到⽂件的现有内容之后,⽽且
该⽬标⽂件中原有的内容不会丢失)。⽂件描述符可以⽤以上3种模式中的任意⼀种来创建。
创建⼀个⽤于读取⽂件的⽂件描述符
[root@dns-node2 tmp]#
aaa
bbb
ccc
[root@dns-node2 tmp]# exec 3& # 创建⼀个新的描述符3, 3和<;和之间千万不能有空格,必须紧挨着。
[root@dns-node2 tmp]# cat <&3
aaa
bbb
ccc
如果要再次读取,我们就不能继续使⽤⽂件描述符 3 了,⽽是需要⽤ exec 重新创建⼀个新的
⽂件描述符(可以是 4 )来从另⼀个⽂件中读取或是重新读取上⼀个⽂件。
创建⼀个⽤于写⼊(截断模式)的⽂件描述符:
[root@dns-node2 tmp]# exec 4&
[root@dns-node2 tmp]# echo newline >&4 # &在这⾥可以理解为获取4这个FD的内存地址(个⼈理解,该理解来⾃go语⾔)[root@dns-node2 tmp]#
newline
追加模式
[root@dns-node2 tmp]# exec 5>&
[root@dns-node2 tmp]# echo Append line >&5
[root@dns-node2 tmp]#
aaa
bbb
ccc
Append line
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论