码迷,mamicode.com
首页 > 其他好文 > 详细

重定向点滴

时间:2017-12-04 00:13:54      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:重定向   shell   


< 标准输入重定向[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 <<EOF

> 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/-


小小总结,如有错误,欢迎指正。谢谢


重定向点滴

标签:重定向   shell   

原文地址:http://blog.51cto.com/191226139/2047016

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!