1、什么是I/O重定向
在说I/O重定向之前,先来说说数据流的概念吧。数据流分为三种:标准输入(stdin),标准输出(stdout)和标准错误输出(stderr)。简单来说,标准输入指的是通过键盘键入的信息,标准输出指的是命令执行所回传的正确信息,而标准错误输出指的是命令执行失败后,所回传的错误信息。而I/O重定向就是指修改这些默认的I/O,对原来系统命令的默认执行方式进行改变,通过重定向操作符将命令输入和输出数据流定向到其他位置。
2、I/O重定向的实现
<1>输出重定向的描述符
描述符 |
输出重定向 |
COMMAND > stdout |
stdout作为标准输出(覆盖) |
COMMAND >> stdout |
stdout作为标准输出(追加) |
COMMAND 2> stderr |
stderr作为错误输出(覆盖) |
COMMAND 2>> stdout |
stderr作为错误输出(追加) |
COMMAND &> |
标准输出和输出重定向至新文件(覆盖) |
COMMAND &>> |
标准输出和输出重定向至新文件(追加) |
<2>输入重定向的描述符
描述符 |
输入重定向 |
COMMAND < stdin > stdout |
COMMAND以stdin作为标准输入,stdout作为标准输出 |
COMMAND < stdin |
COMMAND以stdin作为标准输入 |
<3>标准输出重定向代码详解
▲输入一段信息重定向
[root@centos7 ~]# echo hello > file1
[root@centos7 ~]# cat file1
hello
▲再输入一段信息,内容将会被覆盖
[root@centos7 ~]# echo sky > file1
[root@centos7 ~]# cat file1
sky
▲使用追加输出重定向,内容将不再会被覆盖
[root@centos7 ~]# echo who >> file1
[root@centos7 ~]# cat file1
sky
who
[root@centos7 ~]#
注:2>、2>>和&>、&>>与上格式相同
*错误重定向也可以使用2&>1 #####与&>相反
user@centos7 ~]$ l a > file1 2>&1
[user@centos7 ~]$ cat file1
bash: l: command not found...
[root@centos7 ~]# l b >> file1 2>&1
[root@centos7 ~]# cat file1
bash: l: command not found...
bash: l: command not found...
[root@centos7 ~]# ca file1 | tr '[a-z]' '[A-Z]'
bash: ca: command not found...
Similar commands are::
'ac'
'sa'
[root@centos7 ~]# ca file1 2>&1 | tr '[a-z]' '[A-Z]'
BASH: CA: COMMAND NOT FOUND...
SIMILAR COMMANDS ARE::
'AC'
'SA'
*同时定向输入和输出文件
[root@centos7 ~]# ls a.txt fdsf > file1 2> file2
[root@centos7 ~]# cat file1
a.txt
[root@centos7 ~]# cat file2
ls: cannot access fdsf: No such file or directory
<4>标准输入代码重定向详解
▲用<表示命令所要读取的文件
[root@centos7 ~]# echo "first line" > file2
[root@centos7 ~]# tr -d fir < file2
st lne
[root@centos7 ~]#
▲先用<表示要读取的文件,再使用>表示定向的文件
[root@centos7 ~]# echo "second line" > file3
[root@centos7 ~]# tr -d second < file3 > file4
[root@centos7 ~]# cat file4
li
<5>锁定输出重定向
set -C:禁止将内容覆盖到原文件,但可追加强制覆盖>|
set +C:允许覆盖
[root@centos7 user1]# echo "thompson" > file5
[root@centos7 user1]# set -C
[root@centos7 user1]# echo "test" > file5
-bash: file5: cannot overwrite existing file
[root@centos7 user1]# echo "test" >| file5
[root@centos7 user1]# set +C
[root@centos7 user1]# echo "newtest" > file5
[root@centos7 user1]# cat file5
newtest
补充:cat利用重定向的三个特殊用法
▲cat > FILE:单行重定向(即回车即写入)至FILE
[root@centos7 ~]# cat > file5
pipe
shadow
^C
[root@centos7 ~]# cat file5
pipe
shadow
▲cat f1 f2 > f3:多行将多个文件的内容合并成一个
[root@centos6 testdir]# cat > f1
a
^C
[root@centos6 testdir]# cat > f2
b
^C
[root@centos6 testdir]# cat f1 f2 > f3
[root@centos6 testdir]# cat f3
a
b
下面俩个是特殊用法,要记住
▲cat << EOF:输入内容并显示,常用作此处文档
[root@centos7 ~]# cat << EOF
> hello
> welcom to university
> EOF
hello
welcom to university
[root@centos7 ~]#
▲cat << EOF > FILE:多行重定向(即退出才写入)至FILE
[root@centos7 ~]# cat << EOF > file5
> i can fly
> EOF
[root@centos7 ~]# cat file5
i can fly
[root@centos7 ~]#
补充mail的用法:
mail发送邮件的方法
<1>直接使用shell当编辑器
[root@centos7~]#mail -s "hello" [email protected]
welcome to my system
EOT # Ctrl+d 退出编辑
<2>使用管道发送右键
[root@centos7~]#echo "welcome to my system" | mail -s "hi" [email protected]
You have mail in /var/spool/mail/root
<3>使用输入重定向发送右键(重定向的必须是文件)
[root@centos7~]#mail -s "ok" [email protected] < mail.txt