• 『忘了再学』Shell基础 — 6、Bash基本功能(输入输出重定向)


    1、Bash的标准输入输出

    我们前边一直在说,在Linux系统下,一切皆是文件,键盘和显示器等硬件都是文件,如下图:

    image

    从上图中可以看出,键盘的设备文件名为/dev/stdin,显示器标准正确输入的设备文件名为/dev/stdout,显示器标准错误输入的设备文件名为/dev/stderr

    这些设备文件名非常不好记忆,Shell允许我们用文件描述符来描述对应的设备,也就是用0、1、2,分别对应键盘、正确显示器,错误显示器。

    2、输出重定向

    什么叫输出重定向?

    命令的输出,是输出给标准输出的,也就是输出到显示器上。而输出重定向就是命令的输出,不输出给标准输出,而是把输出的内容,输出到文件中。

    (1)标准输出重定向

    • 命令 > 文件:以覆盖的方式,把命令的正确输出,输出到指定的文件或设备当中。
    • 命令 >> 文件:以追加的方式,把命令的正确输出,输出到指定的文件或设备当中。

    示例如下:

    shell
    # 覆盖的方式
    [root@localhost ~]# pwd	> abc
    [root@localhost ~]# cat abc
    /root
    
    # 追加的方式
    [root@localhost ~]# pwd	>> abc
    [root@localhost ~]# cat abc
    /root
    /root

    只要该命令有结果,都能够输进行输出重定向。

    (2)标准错误输出重定向

    如果执行的命令出现报错,用上边的方式是不能够进行输出内容重定向的,错误信息会直接输出到标准错误输出,如下:

    shell
    [root@localhost ~]# lsdgagsa >> abc
    -bash: lsdgagsa: command not found
    • 错误命令 2>文件:以覆盖的方式,把命令的错误输出,输出到指定的文件或设备当中。
    • 错误命令 2>>文件:以追加的方式,把命令的错误输出,输出到指定的文件或设备当中。

    这个2是文件描述符,表示标准错误输出,看上表。

    示例如下:

    shell
    [root@localhost ~]# lsdgagsa 2>> abc
    [root@localhost ~]# cat abc
    /root
    /root
    -bash: lsdgagsa: command not found

    这里需要注意的是,上边的标准正确输出和标准错误输出的重定向有一些小问题,就是我要事先知道这条命令是否报错,才能选择是使用标准正确输出还是使用标准错误输出。

    这样十分不合理,我明知道命令会报错,那我直接写对不就完了。所以我们在工作中写脚本的时候,常用的输出重定向的方式是下面的方式。

    (3)正确输出和错误输出同时保存

    方式一

    • 命令 > 文件 2>&1:以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。
    • 命令 >> 文件 2>&1:以追加的方式,把正确输出和错误输出都保存到同一个文件当中。(常用)

    示例如下:

    shell
    # 把ls命令的查询结果覆盖存储到abc文件中
    [root@localhost ~]# ls > abc  2>&1
    [root@localhost ~]# cat abc
    anaconda-ks.cfg
    install.log
    install.log.syslog
    
    # 把错误信息追加存储到abc文件中
    [root@localhost ~]# lsadfgag >> abc  2>&1
    [root@localhost ~]# cat abc
    anaconda-ks.cfg
    install.log
    install.log.syslog
    -bash: lsadfgag: command not found

    命令 >> 文件 2>&1的意思是,把命令的正确输出,输出到文件中,然后把命令的错误输出,输出到正确输出的文件中。

    方式二

    • 命令 &>文件:以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。
    • 命令 &>>文件:以追加的方式,把正确输出和错误输出都保存到同一个文件当中。(常用)

    示例如下:

    shell
    #pwd命令的结果覆盖存储到abc文件中
    [root@localhost ~]# pwd &> abc
    [root@localhost ~]# cat abc
    /root
    
    # 把错误信息追加存储到abc文件中
    [root@localhost ~]# lsadfgag &>> abc
    [root@localhost ~]# cat abc
    /root
    -bash: lsadfgag: command not found

    方式三

    命令>>文件1 2>>文件2:把正确的输出追加到文件1中,把错误的输出追加到文件2中。(常用)

    image

    统一保存和分开保存看你习惯。

    注意,在正确输出的时候>或者>>两边是可以有空格的,如果是错误输出的时候,2和>或者>>之间是不能有空格的。

    如下,提示语法错误。

    shell
    [root@localhost ~]# lsgdagasasd >> abc 2 > &1
    -bash: syntax error near unexpected token `&’

    3、输入重定向

    输入重定向就是<。意思是命令的输入是由标准输入输入的,也就是由键盘输入的。输入重定向就是改变输入方向,不在由键盘作为输入,而拿文件作为命令的输入。(输入重定向比较少见)

    我们只在之前给源码包打补丁的patch命令(文章https://www.cnblogs.com/liuyuelinfighting/p/15574188.html),和RPM源码包文件提取中的cpio命令用到过。

    <<号用的就更少了,基本没有实际的应用。

    image

    uio就相当于一个分界符,在两个uio中间的内容,输入给wc命令,进行统计。


    __EOF__

  • 本文作者: 繁华似锦的博客
  • 本文链接: https://www.cnblogs.com/liuyuelinfighting/p/16076000.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    H5+Css3文本溢出添加省略号(包括插件)
    Java.lang.Class类 getName()方法有什么功能呢?
    [附源码]计算机毕业设计JAVAjsp运动器材网上销售系统
    期权开户流程、交易时间和规则详解清晰易懂
    【JAVA】继承和多态的子类和父类代码执行顺序研究
    leetcode:2347. 最好的扑克手牌(python3解法)
    【前端学java】复习巩固-Java中的对象比较(14)
    动态多目标优化算法:MOEA/D-FD求解FDA1、FDA2、FDA3、FDA4和FDA5(Matlab代码)
    antd vue实现table的分页组件固定位置的效果
    跨平台应用开发进阶(三十三) :Android上架准备材料及流程介绍
  • 原文地址:https://www.cnblogs.com/liuyuelinfighting/p/16076000.html