I/O重定向有三種定義打開文件:stdin (the keyboard), stdout (the screen), and stderr (error messages output to the screen)。每一個打開的文件都是經過文件描述符(File Descriptor)來標識的,內核爲每一個進程維護了一個文件描述符表,這個表以FD爲索引,再進一步指向文件的詳細信息。在進程建立時,內核爲進程默認建立了0、一、2三個特殊的FD,這就是stdin、stdout和stderr。bash
查看文件File Descriptorapp
[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
支持的操做符號包括:less
1>或 > 把stdout重定向到文件中,並覆蓋文件中的內容ide
示例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重定向到文件中並覆蓋文件中的內容spa
示例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
&> 把全部輸出重定向到文件中並覆蓋文件中的內容orm
示例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
...
追加劇定向(>>),不會覆蓋文件內容server
示例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 :容許覆蓋dns
示例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 </etc/issue
\S
Kernel \r on an \m示例2
[root@localhost~]#cat >f1 <<eof
> 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