一、I/O重定向基本概念
I/O重定向有三种定义打开文件:stdin (the keyboard), stdout (the screen), and stderr (error messages output to the screen)。每个打开的文件都是通过文件描述符(File Descriptor)来标识的,内核为每个进程维护了一个文件描述符表,这个表以FD为索引,再进一步指向文件的详细信息。在进程创建时,内核为进程默认创建了0、1、2三个特殊的FD,这就是stdin、stdout和stderr。
二、stdout和stderr
查看文件File Descriptor
[root@localhost/dev/fd]#ll /dev/fd/ total 0 lrwx------ 1 root root 64 Jul 16 07:18 0 -> /dev/pts/2 lrwx------ 1 root root 64 Jul 16 07:18 1 -> /dev/pts/2 lrwx------ 1 root root 64 Jul 16 07:18 2 -> /dev/pts/2 lr-x------ 1 root root 64 Jul 16 07:18 3 -> /proc/5696/fd
支持的操作符号包括:
1>或 > 把stdout重定向到文件中,并覆盖文件中的内容
示例1 [root@localhost~]#touch a.txt [root@localhost~]#ls > a.txt [root@localhost~]#cat a.txt a anaconda-ks.cfg Desktop Documents Downloads ... 示例2 [root@localhost~]#touch b.txt [root@localhost~]#cat /etc/passwd b.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ...
2> 把stderr重定向到文件中并覆盖文件中的内容
示例1 [root@localhost~]#lss 2> c.txt [root@localhost~]#cat c.txt bash: lss: command not found... Similar command is: 'ls'示例2 [root@localhost~]#ls /ett 2> c.txt [root@localhost~]#cat c.txt ls: cannot access /ett: No such file or directory
&> 把所有输出重定向到文件中并覆盖文件中的内容
示例1 [root@localhost~]#touch d.txt [root@localhost~]#ls /etc /err &> d.txt [root@localhost~]#cat d.txt ls: cannot access /err: No such file or directory /etc: abrt adjtime aliases aliases.db ...
追加重定向(>>),不会覆盖文件内容
示例1 [root@localhost~]#cat a.txt /etc/drirc [root@localhost~]#ls /etc/issue >> a.txt [root@localhost~]#cat a.txt /etc/drirc /etc/issue 示例2 [root@localhost~]#cat b.txt /etc/dnsmasq.conf [root@localhost~]#ls /ett 2>>b.txt [root@localhost~]#cat b.txt /etc/dnsmasq.confls: cannot access /ett: No such file or directory 示例3 [root@localhost~]#cat c.txt ls: cannot access /ett: No such file or directory [root@localhost~]#ls /etc/d dbus-1/ dnsmasq.conf dconf/ dnsmasq.d/ default/ dracut.conf depmod.d/ dracut.conf.d/ dhcp/ drirc dleyna-server-service.conf [root@localhost~]#ls /etc/drirc /ett &> c.txt [root@localhost~]#cat c.txt ls: cannot access /ett: No such file or directory /etc/drirc
2>&1 将错误和正确的信息放到同一个文件中,与>&和1>&2等价
[root@localhost~]#ls /etc/issue /stt > d.txt 2>&1 [root@localhost~]#cat d.txt ls: cannot access /stt: No such file or directory /etc/issue
set -C :禁止将内容覆盖已有文件,但可追加强制覆盖:“>|”
set +C :允许覆盖
示例1 [root@localhost~]#set -C [root@localhost~]#ls /etc/issue > a.txt -bash: a.txt: cannot overwrite existing file [root@localhost~]#ls /ett 2> a.txt -bash: a.txt: cannot overwrite existing file
()合并多个程序的stdout
[root@localhost~]#(ls /etc/issue ; cat a.txt) > c.txt [root@localhost~]#cat c.txt /etc/issue /etc/drirc /etc/issue /etc/issue
三、标准输入
示例1 [root@localhost~]#cat f1 <aaa > bbb > ccc > eof <
四、其他
管道:
COMMAND1 | COMMAND2
将错误和正确标准输出
ls /boot /err 2>&1 |tr 'a-z' 'A-Z' ls /boot /err |& tr 'a-z' 'A-Z'
less 命令可以上下翻 直接退出
more 命令不可以上翻 退出按q
‘- ’符号
示例
将/home里面的文件打包,但打包的数据不是记录到文件,而是传递到stdout,经过管道后,将tar - CVF - /home传递给后面的tar -xvg -,后面的这个 - 则是天谴一个命令的stdout,因此,就不需要使用临时file了
tar -cvf - /home |tar -xvf -
tee命令
-a append 附加 ;不覆盖原文件
示例
ls /boot |tee ls.out