• Shell(3)管道与重定向


    Shell(3)管道与重定向

    一、重定向

    重定向(Redirect)就是通过各种方法将各种请求重新定个方向转到其它位置。

    用户通过操作系统处理信息的过程中,包括以下几类交互设备文件:

    标准输入(STDIN):默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入数据。

    标准输出(STDOUT):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。

    标准错误(STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件。

    从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上。

    1.重定向输出

    重定向输出指的是将命令的正常输出结果保存到指定文件中,而不是直接显示在显示器的屏幕上。

    重定向输出使用“>”或“>>”,分别代表覆盖或追加入文件。

    若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中;若目标文件已经存在,则将输出结果覆盖或追加到文件中。

    “>”:当原来的文件中有内容的话,原来的内容会被覆盖掉。

    “>>”:当原来的文件中有内容的话,新家的内容会追加到里面而不会覆盖原来的内容。

    再用“>”输入一个字符串到刚刚的文件中:

    可以看到,刚刚uname -p命令写入的内容被覆盖了。再用“>>”加入字符串看一下效果。

    可以看到,新输入的内容是被追加进了文件中,而不是覆盖。

    2.重定向输入

    重定向输入指的是将命令中接受输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<”操作符。通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成。

    例如:使用passwd命令为用户设置密码时,每次都必须根据提示输入两次密码字串,比较繁琐,但是通过重定向输入的方式可以省略交互式的过程,而自动完成密码设置。

    3.定义分界符

    “<<”定义分界符符号,可以将某个字符或字符串作为分界符只要不输入该字符串就会一直输入数据从而显示到屏幕。

    分界符可同时适用于stdin和stdout。

    4.cat命令

    默认情况下,cat命令会接受标准输入设备(键盘)的输入,并显示到控制台,但如果用文件代替健盘作为输入设备,那么该命令会以指定的文件作为输入设备,并将文件中的内容读取并显示到控制台:

    cat命令配合重定向输出“>”“>>”,使原本的输出位置发生改变。原本对stdout输出到的位置进行改写同时,重定向输出还具有检测目标文件是否存在,是的话则执行输出,否的话则先创建文件再输出到文件中。

    cat命令配合重定向输入“<”,cat命令原本的功能中,是通过读取文件来获取到的,而配合重定向输入,则是使控制的方向在stdin时,同时直接输出到屏幕上。

    5.错误重定向

    错误重定向是指将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符。

    作用:

    在实际应用中,错误重定向可用来手机程序执行的错误信息,为拍错提供依据。

    还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁。

    使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件则使用“2>>”操作符。

    混合输入:

    当命令输出的结果可能既包含标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符“>”“2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”或“>&”操作符将两类输出信息保存到同一个文件。&表示混合的意思。

    2>&1:把标准输出重定向到标准错误。

    1>&2:把标准错误重定向到标准输出。

    /dev/null:黑洞文件,所有写入它的内容都会永远消失,而尝试从它那儿读取内容的话则什么都没有,/dev/null文件对命令行和脚本都非常的有用。

    二、管道

    管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

    在shell脚本应用中,管道操作通常用来过滤所需要的关键信息。

    总结

    重定向和管道操作是shell中十分常用的功能,有助于编写代码简洁但功能强大的shell脚本程序。

    END

  • 相关阅读:
    【JSON】java获取json数组格式中的值
    htaccess绕过上传实验
    基于Java的剧本杀预约系统设计与实现(源码+lw+部署文档+讲解等)
    基于matlab创作简易表白代码
    腾讯云轻量应用服务器性能差吗?为什么便宜?
    STM32:GPIO--点亮灯(软件部分+操作步骤+解释)
    记录使用layui弹窗实现签名、签字
    添加docker容器数据卷
    s20.基于 Kubernetes v1.25.0(kubeadm) 和 Docker 部署高可用集群(二)
    8、JdbcTemplate
  • 原文地址:https://blog.csdn.net/tu464932199/article/details/125561153