设为首页收藏本站

17nyy 国内著名免费干货分享社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 327|回复: 0

重定向点滴

[复制链接]
  • TA的每日心情
    难过
    2020-10-4 20:24
  • 主题

    帖子

    0

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    0
    发表于 2020-1-1 21:47:02 | 显示全部楼层 |阅读模式
      < 标准输入重定向[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/-
      

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



    来源:51CTO博客作者ljpwinxp的原创作品 https://blog.51cto.com/191226139/2047016
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|一起赢 ( 蜀ICP备19039281号-1 )

    GMT+8, 2020-10-29 02:07 , Processed in 0.110159 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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