< 标准输入重定向[StdIN]。代码为0 默认接收来自键盘的输入。
> 标准输出重定向(正确) [StdOUT]。代码为1。默认输出到终端窗口。
2> 标准输出重定向(错误)[StdErr]。 代码为2。默认输出到终端窗口。
可以将输出重定向到其他输出设备
#tty
/dev/pts/0
#echo "this msg from pts/0" > /dev/pts/1
StdIN和StdOUT可以被重定向到文件
格式:
命令 重定向符号 文件名
支持的操作符号包括:
> StdOUT重定向到文件
< StdIN 重定向输入
2> 把ErrStdOUT重定向到文件
&> 把所有输出(不管正确错误)覆盖重定向到文件
&>> 把所有输出(不管正确错误)追加重定向到文件
> 文件内容会被覆盖
>> 原有内容基础上追加内容
set –C 禁止将内容覆盖已有文件,但可追加
set +C 允许覆盖
>| file 强制覆盖,会丢失原有内容
/dev/null 重定向到此设备将会无任何信息输出
2>&1 将 StdErr重定向至StdIN输出,即将错误定向到正确1输出
1>&2 将 StdOUT重定向至StdErr输出,即将正确定向到错误2输出
若后面出现多个重定向符时,默认就是并行运行,一定要注意各自己的输出至哪里
> 或 >> 在没有内容改变重定向的时候,不会改变时间戳
单行重定向输入回车的时候就会开始重定向,如果是等待输入的情况下,必须有ctrl+d结束将会回车一行定向一行
多行重定向输入必须成对词使用
#cat > all.log <
> 1 LINE
> 2 LINE
> 3 LINE
> EOF
#cat all.log
1 LINE
2 LINE
3 LINE
| 管道 用来连接命令
格式:
命令1 | 命令2 | 命令3 | …
将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
STDERR错误重定向不能通过管道转发,可利用2>&1 或 |& 转化后实现
(errcmd;hostname) 2>&1 > /app/all.log
#aa 2>&1|tr 'a-z' 'A-Z'
-BASH: AA: COMMAND NOT FOUND
#aa |& tr 'a-z' 'A-Z' 此种方法较新,需要考虑到兼容性
-BASH: AA: COMMAND NOT FOUND
最后一个命令会在当前shell进程的子shell进程中执行用来组合多种工具的功能
ls | tr 'a-z' 'A-Z'
(把ls的输出结果作为tr的输入,再将输入的内容中的小写字母转化为大写字母后输出到屏幕)
#cat linux.txt |mail -s h6 root
- 符号
示例:
将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,
经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 则是取前一个命令的
stdout, 因此,就不需要使用临时file了
tar -cvf - /home | tar -xvf -
标准输出和错误输出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
合并标准输出和错误输出为同一个数据流进行重定向
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
合并多个程序的STDOUT
( cal 2007 ; cal 2008 ) > all.txt
实例演示:
1.命令嵌套输出
#echo `uname -n` > a
#cat a
a69.hunk.edu
2.连续执行命令时应该用小括号,否则将会只匹配重定向符最近的一个
#(ll;pwd;hostname) > c
#cat c
-rw-r--r--. 1 root root 47 Nov 13 21:24 a
-rw-r--r--. 1 root root 0 Nov 13 21:23 b
-rw-r--r--. 1 root root 0 Nov 13 21:26 c
/app
a69.hunk.edu
3.将StdIN与StdOUT分别输出至不同文件
方法1:
#(errcdm;hostname) > /app/true.log 2> /app/err.log
此行命令解释:()内的正确1输出定向到/app/true.log,错误2输出定向到/app/err.log输出。
所以,文件内应该会有2个文件分别记录
#cat true.log err.log
a69.hunk.edu
-bash: errcdm: command not found
4.将StdIN与StdOUT分别输出同文件
方法1:
#(errcmd;hostname) > /app/all.log 2>&1
#cat all.log
-bash: errcmd: command not found
a69.hunk.edu
方法2:
# (errcmd;hostname) &> all.log 此写法较新,不适用于centos 3,4
#cat all.log
-bash: errcmd: command not found
a69.hunk.edu
2>&1 用法
#(err;hostname) > /app/all.log 2>&1
此行命令解释:()内的正确输出定向到/app/all.log,错误2输出定向到1输出。
所以,文件内应该会有2条记录
#cat all.log
-bash: err: command not found
a69.hunk.edu
#(errcmd;hostname) 2>&1 > /app/all.log
此行命令解释:()内的错误输出2定向到正确1输出,默认就是屏幕输出,正确1输出定向到/app/all.log输出。所以,文件内应该会有1条记录
-bash: errcmd: command not found
#cat all.log
a69.hunk.edu
#((errcmd;hostname) 2>&1) > /app/all.log
此行命令解释:()内的错误输出2定向到正确1输出,默认就是屏幕输出,正确1输出到屏幕,因此,整个外部括号内就是2条信息输出,所以,文件内应该会有2条记录
#cat all.log
-bash: errcmd: command not found
a69.hunk.edu
1>&2 用法
#(errcmd;hostname) 2> /app/all.log 1>&2
此行命令解释:()内的错误输出定向到/app/all.log,正确1输出定向到2输出。
所以,文件内应该会有2条记录
#cat all.log
-bash: errcmd: command not found
a69.hunk.edu
/dev/null用法
#(errcmd;hostname) 2> /dev/null
此行命令解释:()内的错误输出定向到/dev/null,正确1输出到屏幕
所以,屏幕中内应该会有1条正确显示
a69.hunk.edu
嵌套括号
#((errcmd;hostname) 2>&1) > /app/all.log
此行命令解释:2>&1会将错误2定向到1上,因此整个括号内就是2条正确信息定向 /app/all.log
所以,文件中内应该会有2条记录显示
#cat all.log
-bash: errcmd: command not found
a69.hunk.edu
#((errcmd;hostname) 1>&2 ) > /app/all.log
此行命令解释:1>&2会将正确定向到2的输出上,也就是终端窗口上,因此整个括号内就是2条错误信息,那么括号外面是1正确才会定向 /app/all.log,所以文件中内不会有记录显示,只会显示在屏幕
-bash: errcmd: command not found
a69.hunk.edu
#cat /app/all.log
#
set –C
禁止将内容覆盖已有文件,
#set -C
#cat all.log
-bash: errcmd: command not found
a69.hunk.edu
#ls > all.log
-bash: all.log: cannot overwrite existing file
但可以>>追加
#ll >> all.log
#cat all.log
-bash: errcmd: command not found
a69.hunk.edu
-rw-r--r--. 1 root root 75 Nov 13 22:37 all.log
-rw-r--r--. 1 root root 0 Nov 13 21:23 b
-rw-r--r--. 1 root root 152 Nov 13 21:26 c
更牛逼的就是强制>| ,但是, 这个是覆盖清空原有内容
#echo new >| all.log
#cat all.log
new
重定向到多个目标( tee)
格式:
命令1 | tee [-a ] 文件名 | 命令2
把命令1的STDOUT先保存在文件中,同时StdOUT做为命令2的输入
#hostname|tee host.out|tr 'a-z' 'A-Z'
A69.HUNK.EDU
#cat host.out
a69.hunk.edu
-a 追加
使用场景:
保存不同阶段的输出
复杂管道的故障排除
同时查看和记录输出
打开的文件都有一个fd: file descriptor (文件描述符)
使用exec可以定义一个文件描述符
把host.out文件用文件描述符8来定义
#exec 8<>host.out
#ls /proc/$$/fd/ -l
lrwx------. 1 root root 64 Nov 14 16:54 8 -> /app/app/host.out
#cat /proc/$$/fd/8
a69.hunk.edu
#echo aa >> /proc/$$/fd/8
#cat /app/app/host.out
a69.hunk.edu
aa
取消定义关系
#exec 8>- 或 exec 8>&-
[root@a69 app]#ll /proc/$$/fd
lrwx------. 1 root root 64 Nov 14 16:54 8 -> /app/app/-
小小总结,如有错误,欢迎指正。谢谢