Linux文件描述符和重定向

文件描述符:
0:stdin(标准输入)
1:stdout(标准输出)
2:stderr(标准错误)
成功和不成功的命令:

[student@myhost ~]$ ls +
ls: cannot access +: No such file or directory
[student@myhost ~]$ echo $?       #命令出错,$?返回非零错误值
2
[student@myhost ~]$ ls a
a
[student@myhost ~]$ echo $?       #命令成功,$?返回成功值0
0

重定向输出:

[student@myhost ~]$ find . -name a
./a
find: ‘./testdir’: Permission denied
[student@myhost ~]$ find . -name a 1>stdout.txt 2>stderr.txt
[student@myhost ~]$ cat stdout.txt 
./a
[student@myhost ~]$ cat stderr.txt 
find: ‘./testdir’: Permission denied

[student@myhost ~]$ find . -name a > d        #只用>仅会将stdout重定向到文件
find: ‘./testdir’: Permission denied
[student@myhost ~]$ cat d
./a

[student@myhost ~]$ find . -name a &> d       #使用&>可将stdout和stderr重定向到文件
[student@myhost ~]$ cat d
./a
find: ‘./testdir’: Permission denied

[student@myhost ~]$ find . -name a 1>d 2>&1   #使用"1>文件名 2>&1"也可完成stdout和stderr重定向到同一文件
[student@myhost ~]$ cat d
./a
find: ‘./testdir’: Permission denied

tee命令:

[student@myhost ~]$ find . -name a | tee d 
find: ‘./testdir’: Permission denied
./a
[student@myhost ~]$ cat d
./a

以上我们可以看出tee命令会将stdout写入d中,并显示一份副本到显示器。

[student@myhost ~]$ find . -name a | tee d | cat -n
find: ‘./testdir’: Permission denied
     1	./a
 [student@myhost ~]$ cat d
./a

以上我们可以发现第一个find命令执行完之后|命令会将stdout做为stdin发送给tee命令,同时将stderr打印到屏幕上,tee命令将stdin保存到d中,同时|将stdout作为stdin传给cat命令,cat -n以显示行数的方式将上一级传送过来的stdin打印出来。
默认情况下,tee命令会将文件中内容覆盖,可以加一个-a选项指定为附加。
我们也可以将stderr变为stdout:

[student@myhost ~]$ find . -name a 2>&1 | tee d 
./a
find: ‘./testdir’: Permission denied
[student@myhost ~]$ cat d
./a
find: ‘./testdir’: Permission denied

从文件中读取stdin:

[student@myhost ~]$ cat a
hhh
[student@myhost ~]$ tee <a d
hhh
[student@myhost ~]$ cat d
hhh

重定向文件内部文本块:

[student@myhost ~]$ cat a
cat<<EOF>log.txt
LOG FILE HEADER
This is a test log file.
EOF
[student@myhost ~]$ bash a
[student@myhost ~]$ cat log.txt 
LOG FILE HEADER
This is a test log file.

自定义文件描述符:

[student@myhost ~]$ echo This is a test line > b
[student@myhost ~]$ exec 3<b
[student@myhost ~]$ cat <&3
This is a test line

以上为创建一个stdin类型的文件描述符。

[student@myhost ~]$ exec 4>out
[student@myhost ~]$ echo This is a test line >&4
[student@myhost ~]$ cat out 
This is a test line

以上为创建一个stdout的截断类文件描述符。

[student@myhost ~]$ echo a line > hhh
[student@myhost ~]$ exec 6>>hhh
[student@myhost ~]$ echo a new line >&6
[student@myhost ~]$ cat hhh
a line
a new line

以上为创建一个stdout的附加类文件描述符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值