[通俗易懂:Linux标准输入/输出和重定向]Shell脚本之 > /dev/null 2>1命令详解

目录标题

      • 一、> /dev/null 2>&1 命令解析
      • 二、/dev/null 文件浅显理解
      • 三、标准输入、标准输出、标准错误输出
      • 四、输入重定向、输出重定向
      • 五、命令作用与应用场景

如果想看命令意义,可以直接跳到第五部分

一、> /dev/null 2>&1 命令解析

我们在别人的脚本里面常常可以看见这样的代码:

2>/dev/null

输出重定向
或者是这样:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

那么,它们到底是什么意思呢?


解析 > /dev/null 2>&1
要了解这句代码的意思,我们要把它拆分开来一一理解,再融会贯通,才能体会Linux的精密与奥妙。

看起来这是一行代码,实际上,这是两条命令组合而成:
命令组合
如果你知道 >的意思,那么你就会明白,这是两条输出重定向命令。

从符号来解析的话,它可以解析成三种不同元素:
命令解析

  1. >:即我们刚才提到的输出重定向符号
  2. /dev/null:一个特殊文件
  3. 2 、&1:1和2是标准输出和标准错误输出的数值表示,它们还有一个兄弟0:标准输入

接下来,我们一一解析这三个元素,探索命令背后的顶层含义。


二、/dev/null 文件浅显理解

/dev/null是Linux中的特殊文件之一,或称空设备,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF,又被称为位桶(bit bucket)或者黑洞(black hole)。
在这里插入图片描述
大部分人比较喜欢理解为Windows的垃圾桶,不过我更喜欢理解为是一根下水管道。划重点:无论我们向其输入任何数据,都会被它丢弃,且操作成功。

echo hello world > ./null

在这里插入图片描述
它还有两个离得很近的兄弟,zreorandom
/dev/zero : 在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。
在这里插入图片描述
简简单单的一行命令,瞬间产生3.5G数据,直呼内行。

cat ./zero >> ./test.txt

在这里插入图片描述/dev/random :一个特殊的设备文件,可以用作随机数发生器或伪随机数发生器。它允许程序访问来自设备驱动程序或其它来源的背景噪声。
在这里插入图片描述
总结:null是丢弃东西的,zero是产生空白字符的,random是生成随机数的,重点记住null就可以了,后面两个绝大部分场景用不上。


三、标准输入、标准输出、标准错误输出

我们执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr)。Linux终端用2表示标准错误,1表示标准输出,0表示标准输入。

标准输出文件和标准错误输出文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

总结:这一块不用过于抠字眼和理解内涵,我们只需要了解:执行一个shell命令会有输出:标准输出或者错误输出,对应的数值为1,2。如果我们看见1,就要明白指代标准输出信息,看见2明白指代输出错误信息。


四、输入重定向、输出重定向

除了输入重定向、输出重定向(重点),还有标准输入。
符号表示:

  • >重定向标准输出,> filename就是把标准输出存储到文件filename里面。
    在这里插入图片描述

  • - (短横线):表示标准输入,一般用于1个程序需要多个输入的时候。
    在这里插入图片描述

  • <标准输入,后面可以跟可以产生输出的命令,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。应用场景:使用一个不接受文件名作为输入参数的命令,而需要的输入内容又存在一个文件里时。
    在这里插入图片描述

注意:>重定向便准输出,这个命令只针对标准输出,也就是说,如果有错误的信息,还是会打印在屏幕上。

理解了重定向之后,再结合标准输出和标准错误输出,就比较好理解。我们可以结合二者做一个demo。

写一个简单的脚本,包含一条正确的命令和错误的命令,然后使用重定向功能定向到文件。
在这里插入图片描述

执行
在这里插入图片描述
可以看到第一条echo命令成功执行,并被重定向到echo.txt文件中,而cat命令因为当前目录没有这个文件,执行失败,而>符号只能重定向标准输出,因为cat是错误输出,所以未被输出重定向到文件夹,而是输出到屏幕。

总结:输出重定向是重点,我们可以把它理解为,把前一个命令的输出,作为后一个命令的输入。


五、命令作用与应用场景

命令作用:
分别理解了各自的命令意义,串联起来:
在这里插入图片描述
第一个重定向的意思是不输出信息,但输出错误信息,第二个重定向的意思是将标准错误输出重定向到标准输出,连起来的即为:不输出信息,不管是标准输出还是错误输出。

怎么求证呢?来个demo

写个一键启动Hadoop的小脚本

demo2
运行:demo2run
可以看到除了两个echo,还有很多运行的标准输出

重定向操作,可以加在脚本执行的后面,也可以选择执行脚本的时候手动加重定向,此次选择第一种操作。
改写demo
再次运行
demo2run

作用:

  • 用于定时任务的消息邮件清理:定时任务执行时,会发送一封邮件给执行的用户,如果是比较基础的定时任务,日积月累下来,会影响系统的开销,占用存储。
  • 清理不必要的提示:Shell脚本执行的时候,如果输出大量的标准输出,影响用户交互体验。

可能大部分人看完,会有两个疑问:

第一:为什么 2 > &1 有个&符号
答:如果不加&表示重定向到“1”这个文件,&1表示标准输出

第二:为什么是先重定向到null文件,而不是先 2> & 1?会影响到错误输出的重定向吗?
答:优先级问题。错误输出重定向优先于命令重定向,故重定向到null文件时,是标准输出和标准错误输出一起null

demo:
demo3
执行
在这里插入图片描述


天道酬勤,自强不息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/617092.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步&#xff0c;显著提升了各种任务的完成度。然而&#xff0c;其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数&#xff0c;需要…

【spring】@Profile注解学习

Profile介绍 在Spring框架中&#xff0c;Profile注解用于根据特定的配置文件来有条件地激活或禁用Bean的定义。这在开发和测试过程中非常有用&#xff0c;因为它允许你为不同的环境&#xff08;如开发、测试、生产&#xff09;定义不同的配置。 Profile不仅可以标注在方法上&…

fastjson 序列化问题

问题: 使用fastjson 的 对同一个JSONObject对象 多次引用后, 通过 JSON.toJSONString() 方法进行json序列化时出现只有第一次的可以成功序列化未json string 字符串, 后面的对象都为引用地址; 示例: public static void main(String[] args) {JSONObject jsonObject new JSON…

【leetcode面试经典150题】28.盛最多水的容器(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

代码学习记录42---动态规划

随想录日记part42 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.14 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;最长递增子序列 &#xff1b;最长连续递增序列 &#xff1b;最长重复子数组 ;最长公…

selenium添加代理(有账号密码)

以下为各种尝试的记录&#xff0c;正确实现可直接参考最后一条&#xff01; 1&#xff0c;导入Proxy库来添加capabilities属性&#xff1a;可以访问网站&#xff0c;但ip还是本机ip from selenium import webdriver from selenium.webdriver.chrome.options import Options f…

【C++学习】C++11新特性(第一节)

文章目录 ♫一.文章前言♫二.C11新特性♫一.统一的列表初始化♫二.std::initializer_list♫三.声明♫四.decltype关键字♫五.nullptr♫六.新增加容器---静态数组array、forward_list以及unordered系列♫6.1unordered_map与unoredered_set♫6.2array♫6.3 forward_list&#xff…

【静态分析】静态分析笔记04 - 数据流分析(理论)

参考&#xff1a; 【课程笔记】南大软件分析课程4——数据流分析基础&#xff08;课时5/6&#xff09; - 简书 --------------------------------------------------------------------------- 1. 迭代算法 本质&#xff1a;常见的数据流迭代算法&#xff0c;目的是通过迭代…

pycharm debug 的时候 waiting for process detach

当你使用pycharm debug或者run的时候&#xff0c;突然出现了点不动&#xff0c;然后一直显示&#xff1a;waiting for process detach 可能是以下问题&#xff1a; 1、需要设置Gevent compatible pycharm一直没显示运行步骤&#xff0c;只是出现waiting for process detach-C…

C++11 数据结构2 线性表的链式存储,实现,测试

线性表的链式存储 --单链表 前面我们写的线性表的顺序存储(动态数组)的案例&#xff0c;最大的缺点是插入和删除时需要移动大量元素&#xff0c;这显然需要耗费时间&#xff0c;能不能想办法解决呢&#xff1f;链表。 链表为了表示每个数据元素与其直接后继元素之间的逻辑关系…

Linux系统——Elasticsearch企业级日志分析系统

目录 前言 一、ELK概述 1.ELK简介 2.ELK特点 3.为什么要使用ELK 4.完整日志系统基本特征 5.ELK工作原理 6.Elasticsearch介绍 6.1Elasticsearch概述 6.2Elasticsearch核心概念 7.Logstash介绍 7.1Logstash简介 7.2Logstash主要组件 8.Kibana介绍 8.1Kibana简介 …

Netty学习——高级篇2 Netty解码技术

接上篇&#xff1a;Netty学习——高级篇1 拆包 、粘包与编解码技术&#xff0c;本章继续介绍Netty的其他解码器 1 DelimiterBasedFrameDecoder分隔符解码器 DelimiterBasedFrameDecoder 分隔符解码器是按照指定分隔符进行解码的解码器&#xff0c;通过分隔符可以将二进制流拆分…