设为首页 收藏本站
查看: 924|回复: 0

[经验分享] Linux重定向介绍及实例

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-8-30 09:26:35 | 显示全部楼层 |阅读模式
   Linux重定向



程序:指令+数据
读入数据: Input
输出数据: Output
打开的文件都有一个fd: file descriptor (文件描述符)
Linux给程序提供三种I/O设备
   标准输入( STDIN)   0  默认接受来自键盘的输入
    标准输出( STDOUT)     1     默认输出到终端窗口
    标准错误( STDERR)      2     默认输出到终端窗口

[iyunv@localhost /testdir]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 Aug 28 22:22 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Aug 28 22:22 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Aug 28 22:22 /dev/stdout -> /proc/self/fd/1

I/O重定向:改变默认位置

STDOUT和STDERR可以被重定向到文件:
命令 操作符号 文件名
支持的操作符号包括:
>      把STDOUT重定向到文件
2>     把STDERR重定向到文件
&>     把所有输出重定向到文件
> 文件内容会被覆盖
# set -C: 禁止将内容覆盖已有文件,但可追加
强制覆盖: >|
# set +C: 允许覆盖
>> 原有内容基础上,追加内容
   2>: 覆盖重定向错误输出数据流;
   2>>: 追加重定向错误输出数据流;
   标准输出和错误输出各自定向至不同位置:
COMMAND > /path/to/file.out 2> /path/to/error.out
      合并标准输出和错误输出为同一个数据流进行重定向:
&>:覆盖重定向
&>>:追加重定向
COMMAND > /path/to/file.out 2> &1 (顺序很重要)
COMMAND >> /path/to/file.out 2>> &1
find /etc -name passwd 2> /dev/null
      ():合并多个程序的STDOUT
[iyunv@localhost /testdir]# (cal 2016;cal 2017) > cal.txt    #将两个命令的结果输出到cal.txt文件中

[iyunv@localhost /testdir]# (date; lsdf) &> all.txt          #将标准输出和错误输出全部写入到all.txt文件中
[iyunv@localhost /testdir]# cat all.txt
Mon Aug 29 20:04:27 CST 2016
bash: lsdf: command not found...

注意:
1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。
2、“>>”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)或错误输出(2) 绑定。
3、当命令执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。
4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。
5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行

示例:

[iyunv@localhost /testdir]# set -C bs                    #禁止将内容覆盖已有文件
[iyunv@localhost /testdir]# echo "nnnnnnnnnn" > bs
-bash: bs: cannot overwrite existing file
[iyunv@localhost /testdir]# echo "mmmmmmmmm" >| bs
[iyunv@localhost /testdir]# echo "nnnnnnnn" >> bs
[iyunv@localhost /testdir]# cat bs
mmmmmmmmm
nnnnnnnn
[iyunv@localhost /testdir]# set +C bs                    #允许覆盖
[iyunv@localhost /testdir]# echo "aaaaaaaa" > bs

[iyunv@localhost /testdir]# echo "Hello World" > wel    #覆盖写入
[iyunv@localhost /testdir]# echo "Hello" >> wel         #追加写入
[iyunv@localhost /testdir]# cat wel
Hello World
Hello

[iyunv@localhost /testdir]# cat < /etc/issue           #从指定文件读取内容

\S
Kernel \r on an \m

[iyunv@localhost /testdir]# lsdfdf &> err.txt        #不管是标准输出还是错误输出都写入到err.txt文件中
[iyunv@localhost /testdir]# cat err.txt
              bash: lsdfdf: command not found...


从文件中导入STDIN


使用 < 来重定向标准输入

某些命令能够接受从文件中导入的STDIN:

    把/etc/issue中的小写字符都转换成写写字符
    [iyunv@localhost /testdir]# tr 'a-z' 'A-Z' < /etc/issue
    \S
    KERNEL \R ON AN \M

    删除issue文件中的指定的字符
    [iyunv@localhost /testdir]# tr -d 'a-h' < /etc/issue
    \S
    Krnl \r on n \m

    [iyunv@localhost /testdir]# cat > t < test
    [iyunv@localhost /testdir]# cat t
    1212121
    [iyunv@localhost /testdir]# cat test
    1212121


把多行发送给STDIN


使用“ <<终止词”命令从键盘把多行重导向给STDIN
直到 终止词 位置的所有文本都发送给STDIN
有时被称为就地文本( heretext)

[iyunv@localhost /testdir]# cat > file <<end
> hello
> world
> hi,
> end
[iyunv@localhost /testdir]# cat file
hello
world
hi,

  管道


    管道(使用符号“ |”表示)用来连接命令
命令1 | 命令2 | 命令3 | …
    将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
        STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现
    最后一个命令会在当前shell进程的子shell进程中执行用来

    组合多种工具的功能

[iyunv@localhost /testdir]# ls
all.txt  cal.txt  err.txt  file
[iyunv@localhost /testdir]# ls | tr 'a-z' 'A-Z'
ALL.TXT
CAL.TXT
ERR.TXT
FILE
    less :一页一页地查看输入:
[iyunv@localhost /testdir]# ls -l /etc/ | less#分页显示/etc目录下的列表
    mail: 通过电子邮件发送输入:
[iyunv@localhost /testdir]# echo "test mail" | mail -s test root#给root发送邮件
    lpr:把输入发送给打印机
[iyunv@localhost /testdir]# echo "test print" | lpr -P printer

     重定向到多个目标( tee)
    命令1 | tee 文件名 | 命令2
        把命令1的STDOUT保存在文件名中,然后管道输入给命令2
     使用:
    保存不同阶段的输出
    复杂管道的故障排除
    同时查看和记录输出

[iyunv@localhost /testdir]# ls | tee sc.txt | tr 'a-z' 'A-Z'
ALL.TXT
CAL.TXT
ERR.TXT
FILE
[iyunv@localhost /testdir]# cat sc.txt
all.txt
cal.txt
err.txt
file


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-265017-1-1.html 上篇帖子: 安装grafnan 下篇帖子: CentOS6.5下源码编译安装httpd2.4.23 Linux 定向
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表