数据流重定向(>,>>)(<,<<)(2>,2>>)

news2024/11/25 12:43:25

文章目录

  • 数据流重定向
    • 什么是数据流重定向
      • 标准输出(>,>>)与标准错误输出(2>,2>>)
      • /dev/null垃圾桶黑洞设备与特殊写法
      • 标准输入:<与<<
    • 为什么要使用命令输出重定向呢?
    • 案例

数据流重定向

数据流重定向由字面意思来看,好像就是将【数据给他定向到其他地方去】的样子?没错数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据,给他传输到其他地方。

什么是数据流重定向

什么是数据流重定向呢?这得由命令的执行说起,一般来说,如果你要执行一个命令,通常它会是这样的:

image-20230425092132828

我们执行一个命令的时候,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上。

标准输出(>,>>)与标准错误输出(2>,2>>)

简单来说,标准输出指的是命令执行所返回的正确信息,而标准错误输出可理解为命令执行失败后,所返回的错误信息。举例来说,我们系统默认有 /etc/crontab 但却无 /etc/ajkdadjajdaj,此时若执行【cat /etc/crontab /etc/ajkdadjajdaj】这个命令时,cat会进行:

  • 标准输出:读取/etc/crontab后,将该文件内容显示到屏幕上
  • 标准错误输出:因为无法找到 /etc/ajkdadjajdaj ,因此在屏幕上显示错误信息

不管正确或错误的数据都是默认输出到屏幕上的,所以屏幕会很乱。那能不能通过某些机制将两股数据分开?那就是数据流重定向的功能,数据流重定向可以将STDOUT(标准输出)与STDEER(标准错误输出)分别传送到其他文件或设备,而分别传送所使用的特殊字符如下:

  • 标准输入(STDIN):代码为0,使用<或<<
  • 标准输出(STDOUT):代码为1,使用>或>>
  • 标准错误输出(STDEER):代码为2,使用2>或2>>

为了理解STDOUT和STDEER,我们可以先来进行一个案例练习:

[root@localhost ~]# ll /                # 屏幕会显示出文件名的信息
[root@localhost ~]# ll / > ~/rootfile   # 屏幕并无信息
[root@localhost ~]# ll ~/rootfile       # 新文件被建立了
-rw-r--r--. 1 root root 1014 425 09:34 /root/rootfile

屏幕为什么不会输出信息呢?这是因为原本【ll /】所显示的数据已经被重定向到 ~/rootfile 文件中了,这个~/rootfile的文件名可以随便取。当你执行【cat ~/rootfile】那就可以看到原本应该在屏幕上面的数据。

[root@localhost ~]# cat ~/rootfile 
总用量 20
lrwxrwxrwx.   1 root root    7 45 20:07 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 420 11:03 boot
drwxr-xr-x.  20 root root 3260 425 09:07 dev
drwxr-xr-x.  76 root root 8192 425 09:07 etc
drwxr-xr-x.   2 root root    6 411 2018 home
lrwxrwxrwx.   1 root root    7 45 20:07 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 45 20:07 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 411 2018 media
drwxr-xr-x.   2 root root    6 411 2018 mnt
drwxr-xr-x.   2 root root    6 411 2018 opt
dr-xr-xr-x. 180 root root    0 425 09:07 proc
dr-xr-x---.   4 root root  221 425 09:34 root
drwxr-xr-x.  26 root root  780 425 09:07 run
lrwxrwxrwx.   1 root root    8 45 20:07 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 411 2018 srv
dr-xr-xr-x.  13 root root    0 425 09:07 sys
drwxrwxrwt.  16 root root 4096 425 09:07 tmp
drwxr-xr-x.  13 root root  155 45 20:07 usr
drwxr-xr-x.  19 root root  267 45 20:14 var

如果我再次执行【ll /home > /rootfile】后,这个/root/file 文件的内容会变成什么样呢?

[root@localhost ~]# ll /home/ > ~/rootfile 
[root@localhost ~]# cat ~/rootfile 
总用量 0
drwx------. 2 csq csq 62 425 09:52 csq
drwx------. 2 zhw zhw 62 425 09:52 zhw
drwx------. 2 zzh zzh 62 425 09:52 zzh

他变成【仅有 ll /home】的数据了,这是为什么呢?原本的【ll / 】 的数据不见了,这是因为文件的建立方式是:

  • 该文件(~/rootfile)若不存在,系统会自动地将它建立起来
  • 当这个文件存在的时候,那么系统就会先将这个文件内容清空,然后再将数据写入
  • 也就是若以>输出到一个已存在的文件中,这个文件就会被覆盖掉

那么如果我想要将数据累加而不想要将旧的数据删除,应该怎么做?利用两个大于的符号(>>)就好了。以上吗的案例来说,你应该要改成【ll / >> ~/roofile】 即可。如此一来,当~/rootfile不存在系统会主动建立这个文件,若该文件存在,则数据会在该文件的最下面累加进去。

那如果是标准错误的错误数据呢?那就通过2>及2>>,同样是覆盖(2>)与累加(2>>)的特性。刚刚上面说到stdout代码是1,而stderr代码是2,所以这个2>是很容易理解的,如果仅存在>时,则代表默认代码1,也就是说:

  • 1>:以覆盖的方法将【正确的数据】输出到指定文件或设备上
  • 1>>:以累加的方法将【正确的数据】输出到指定文件或设备上
  • 2>:以覆盖的方法将【错误的数据】输出到指定的文件或设备上
  • 2>>:以累加的方法将【错误的数据】输出到指定的文件或设备上

要注意【1>>】以及【2>>】中间是没有空格的

了解完概念再看看怎么使用,当你以一般身份执行find这个命令时,由于权限的问题可能会产生一些错误信息,例如执行【find / -name testing】时,可能会产生类似【find:/root:Permission denied】之类的信息,例如下面这个案例:

[csq@localhost ~]$ find /home -name .bashrc   # 我此时的身份是csq这个一般用户
/home/csq/.bashrc                            <== 可以访问自己的目录下面的.bashrc文件
find: ‘/home/zhw’: Permission denied         <== 报错没有权限访问
find: ‘/home/zzh’: Permission denied         <== 报错没有权限访问

由于/home下面还有我们建立的其他账号存在,这些账号的根目录你当然不能进入,所以就会有错误及正确数据。

那么假如我想要将数据输出到 list 这个文件中呢?执行【find /home -name .bashrc > list】会有什么结果呢?

[csq@localhost ~]$ find /home -name .bashrc > list
find: ‘/home/zhw’: Permission denied
find: ‘/home/zzh’: Permission denied
[csq@localhost ~]$ cat list 
/home/csq/.bashrc

你会发现list里面只存了刚刚的那个【正确】的输出数据。

如果我想要将正确的与错误的数据分别存入不同的文件中需要怎么做呢?

[csq@localhost ~]$ find /home -name .bashrc > list_right 2> list_error 
[csq@localhost ~]$ cat list_right 
/home/csq/.bashrc
[csq@localhost ~]$ cat list_error 
find: ‘/home/zhw’: Permission denied
find: ‘/home/zzh’: Permission denied

你可以看到屏幕上不会出现任何信息,因为刚刚执行的结果中,有Permission denied错误的信息都会跑到【list_error】这个文件中,至于正确的信息则会存在【list_right】文件中。Do you understand?

/dev/null垃圾桶黑洞设备与特殊写法

你可以想象以下,如果我知道会有错误信息的发生,所以要将错误信息忽略掉不显示或存储应该怎么办?这个时候黑洞设备/dev/null 就很重要了,这个/dev/null 可以吃掉任何导向这个设备的信息。用法如下:

[csq@localhost ~]$ find /home -name .bashrc 2> /dev/null
/home/csq/.bashrc
# 将错误的数据丢弃,屏幕上会显示正确的数据

如果我想要将正确的数据与错误的数据通通都写入一个文件中应该怎么做?这个时候就得使用特殊的写法了,如下案例

[csq@localhost ~]$ find /home -name .bashrc > list 2>list   # 错误的写法
[csq@localhost ~]$ cat list       
find: ‘/home/zhw’: Permission denied
find: ‘/home/zzh’: Permission denied   # 只会显示错误的数据,不会显示正确的数据

[csq@localhost ~]$ find /home -name .bashrc > list 2>&1     # 正确的写法
[csq@localhost ~]$ cat list
/home/csq/.bashrc
find: ‘/home/zhw’: Permission denied
find: ‘/home/zzh’: Permission denied   # 正确的数据和错误的数据都显示了

[csq@localhost ~]$ find /home -name .bashrc &>list         # 正确的写法
[csq@localhost ~]$ cat list
/home/csq/.bashrc
find: ‘/home/zhw’: Permission denied
find: ‘/home/zzh’: Permission denied   # 正确的数据和错误的数据都显示了

上述案例中,第一种写法错误的原因是,有两股数据同时写入一个文件,又没有特殊的语法,此时两股数据可能会交叉写入该文件内,造成次序错乱。上述案例中有两种写法,可以选择第二种写法最为常用

标准输入:<与<<

了解完标准输出和标准错误输出后,那么这个<与<<又是什么呢?以最简单的语法来说,那就是【将原本需要由键盘输入的数据,改由文件内容来替换】的意思。我们先由下面的cat命令操作了解一下什么叫做键盘输入吧

案例:利用cat命令来建立一个文件的简单流程
[csq@localhost ~]$ cat > catfile
I like Linux
but I don't like English
<== 这里按下ctrl + d 来退出
[csq@localhost ~]$ cat catfile 
I like Linux
but I don't like Englisht

由于加入> 在cat后,所以这个catfile会被主动地建立,而内容就是刚刚键盘上面输入的那两行数据了。那我能不能用纯文本替换键盘输入,也就是说,用某个文件的内容来替换键盘的输入

案例:用stdin替换键盘的输入以建立新文件的简单流程
[csq@localhost ~]$ cat > catfile < ~/.bashrc 
[csq@localhost ~]$ ll catfile ~/.bashrc 
-rw-rw-r--. 1 csq csq 231 Apr 25 15:13 catfile
-rw-r--r--. 1 csq csq 231 Apr  1  2020 /home/csq/.bashrc
# 可以看到两个文件大小一模一样,可以自行查看一下内容也是一模一样的

了解了<之后,那么<<是什么呢?它代表的是【结束的输入字符】的意思。

举例来说:我要用cat直接将输入的信息输出到catfile种,且当由键盘输入eof时,该次输入就结束

[csq@localhost ~]$ cat  > catfile << "eof"
> I like Linux
> I dont like 银阁里希
> eof
[csq@localhost ~]$ cat catfile 
I like Linux
I dont like 银阁里希   # 只有这两行没有关键词eof的那一行

为什么要使用命令输出重定向呢?

  • 屏幕输出的信息很重要,而且我们需要将他存下来的时候
  • 后台执行的程序,不希望它干扰屏幕正常的输出结果时
  • 一些系统的计划任务命令(例如写在/etc/crontab 中的文件)的执行结果,希望它可以存下来时
  • 一些执行命令的可能已知错误信息时,想以【2> /dev/null】将它丢掉
  • 错误信息与正确信息需要分别输出时。

还有root都会收到系统crontab传来的错误信息?这个东西是常见的错误,而如果我们已经知道这个错误信息是可以忽略的时候,可以使用【2> errorfile】这个功能就很重要了。

案例

假设我要将echo "error message"以标准错误的格式来输出,该如何处置?

既然有2>&1来将2>转到1>去,那么应该会有1>&2吧,因此你可以这样做

[csq@localhost ~]$ echo "error message" 1>&2
error message
[csq@localhost ~]$ echo "error message" 2> /dev/null 1>&2

第一行中有信息输入到屏幕上,第二条则没有信息,这表示信息已经通过2> /dev/null丢掉了垃圾桶中了,可以肯定的是错误信息

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地缓存解决方案Caffeine | Spring Cloud 38

一、Caffeine简介 Caffeine是一款高性能、最优缓存库。Caffeine是受Google guava启发的本地缓存&#xff08;青出于蓝而胜于蓝&#xff09;&#xff0c;在Cafeine的改进设计中借鉴了 Guava 缓存和 ConcurrentLinkedHashMap&#xff0c;Guava缓存可以参考上篇&#xff1a;本地缓…

分布式消息队列Kafka(三)- 服务节点Broker

1.Kafka Broker 工作流程 &#xff08;1&#xff09;zookeeper中存储的kafka信息 ​ 1&#xff09;启动 Zookeeper 客户端。 [zrclasshadoop102 zookeeper-3.5.7]$ bin/zkCli.sh ​ 2&#xff09;通过 ls 命令可以查看 kafka 相关信息。 [zk: localhost:2181(CONNECTED) 2]…

ES6 新特性的let--const 解构赋值--模板字符串--对象相关新特性--箭头函数--综合代码示例

目录 ES6 新特性 ES6 基本介绍 ES6 是什么? let 声明变量 演示 let 的基本使用 注意事项和使用细节 代码演示 : const 声明常量/只读变量 应用实例 注意事项和使用细节 解构赋值 基本介绍 应用实例-数组解构 应用实例-对象解构 模板字符串 基本介绍 应用实例…

一次说透,4大服务性幂等场景架构设计方案!

服务幂等性架构设计 作者: 博学谷狂野架构师GitHub&#xff1a;GitHub地址 &#xff08;有我精心准备的130本电子书PDF&#xff09; 只分享干货、不吹水&#xff0c;让我们一起加油&#xff01;&#x1f604; 防重表实现幂等 对于防止数据重复提交&#xff0c;还有一种解决方案…

delta.io 数据湖 checkpoint是什么

checkpoint的直观表现 插入操作 --- /tmp/delta-table/_delta_log 路径下文件的作用 delta-table 是表名 我执行的操作: INSERT OVERWRITE delta.`/tmp/delta-table` SELECT col1 as id FROM VALUES 7,22; 对应的操作日志: /tmp/delta-table/_delta_log/00000000000000…

PPOCR -训练模型转推理模型遇到的问题

前言 使用PPOCR命令行训练验证码单字位置检测识别模型的情况下&#xff0c;这两个checkpoint训练模型测试图片均没出现问题&#xff0c;但转为inference推理模型的时候&#xff0c;问题来了。 问题1&#xff1a;文字检测的训练模型转为推理模型结果全为空 官方文档中确实有提…

ClickHouse初级

ClickHouse初级 一、ClickHouse的特点1.列式存储2.DBMS的功能3.多样化引擎4.高吞吐写入能力 LSM Tree5.数据分区与线程级并行6.性能对比 二、ClickHouse安装三、数据类型3.1整型3.2浮点型3.3 布尔型3.4 Decimal型3.5 字符串3.6 枚举类型3.7 时间类型3.8 数组 四、表引擎4.1 表引…

Semantic Kernel 知多少 | 开启面向 AI 编程新篇章

在 ChatGPT 火热的当下, 即使没有上手亲自体验&#xff0c;想必也对 ChatGPT 的强大略有耳闻。当一些人在对 ChatGPT 犹犹豫豫之时&#xff0c;一些敏锐的企业主和开发者们已经急不可耐地开展基于 ChatGPT 模型 AI 应用的落地探索。 因此&#xff0c;可以明确预见的是&#xf…

生信刷题之ROSALIND——Part 3

目录 1、Mortal Fibonacci RabbitsProblemSample DatasetSample OutputCodeOutput 2、Overlap GraphsProblemSample DatasetSample OutputCodeOutput 3、Calculating Expected OffspringProblemSample DatasetSample OutputCodeOutput 4、Finding a Shared MotifProblemSample …

TF卡目录显示文件夹变0字节的方法

关于电脑上的目录打不开是什么原因&#xff0c;电脑目录打不开是什么原因这个许多人还不清楚&#xff0c;今天小编来为大家解答目录打不开状况&#xff0c;此刻让好多人一起来瞧瞧吧&#xff01; TF卡目录显示文件夹变0字节的方法 工具/软件&#xff1a;sayRecy 步骤1&#xff…

ref的使用与数组中的最全的使用方法

目录 1.ref的使用 什么是 ref 引用&#xff1f; 使用ref引用组件实例 2. this.$nextTick(cd) 方法 数组中的方法 1.some方法 --- 查找到目标元素后就停止后面的查找 2.every----判断每一项是否都满足要求 3.reduce方法 4. filter()方法 5. map()方法 6. forEach()方法…

2023年第十二届数据技术嘉年华(DTC)资料分享

第十二届数据技术嘉年华&#xff08;DTC 2023&#xff09;已于4月8日在北京圆满落幕&#xff0c;大会围绕“开源融合数智化——引领数据技术发展&#xff0c;释放数据要素价值”这一主题&#xff0c;共设置有1场主论坛&#xff0c;12场专题论坛&#xff0c;68场主题演讲&#x…

低调且强大——JNPF低代码平台

前言 先说说很多人为什么要用低代码平台。大部分的反馈是“懒”&#xff0c;其次就是后台管理这东西吧&#xff0c;来来回回就那些东西&#xff0c;查询/表单/表格/弹窗之类的&#xff0c;加上一些增删改查的逻辑。很多人表示&#xff0c;呆过的公司好几家了&#xff0c;后管的…

《低代码PaaS驱动集团企业数字化创新白皮书》-未来展望

未来展望 低代码PaaS发展的机遇 低代码开发可以帮助企业灵活搭建数字化应用&#xff0c;满足企业各业务部门的个性化、碎片化需求。根据IDC调研结果显示&#xff0c;当前低代码开发主要应用于面向企业内部的应用&#xff0c;占该应用总量的比例达到 11.6%&#xff1b;其次是面…

debug的用法和方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言debug三种方式 1.按照条件输出 2.进入方法 3.回退到上一个方法 一、debug是什么&#xff1f;二、使用步骤1.方法debug 在条件输出的时候按照条件输出进入方法内…

idea好用插件分享——Bito-ChatGPT

文章目录 安装步骤&#xff1a;第一步&#xff1a;打开Setting第二步&#xff1a;选择Plugins&#xff0c;输入Bito&#xff0c;就可以搜索出来了&#xff0c;再点击安装第三步&#xff1a;安装完成回到IDEA主界面&#xff0c;右边区域可以看到Bito图标&#xff0c;点击展开&am…

Java---异常概述

&#xff08;一&#xff09;认识Java的异常 1、什么是异常 在使用计算机语言进行项目开发的过程中&#xff0c;即使程序员把代码写得尽善尽美&#xff0c;在系统的运行过程中仍然会遇到一些问题&#xff0c;因为很多问题不是靠代码能够避免的&#xff0c;比如&#xff1a;客户…

【软件工程】UML序列图

一.概述 序列图&#xff08;时序图&#xff09;是一种软件工程行化建模方法&#xff0c;用于可视化系统或应用程序中多个对象之间 的交互。在序列图中&#xff0c;每个对象都表示为竖直线&#xff0c;对象之间的消息则表示为水平箭头 从一个对象指向另一个对象。 序列图可以…

Canvas实现动态绘制圆周效果|实现奥运五环

步骤实现&#xff1a; 首先&#xff0c;创建一个 HTML 画布和一个 JavaScript 动画函数。 在画布上绘制一个圆。 定义一个变量来表示圆心的坐标和半径。 进行动画循环以更新圆心坐标&#xff0c;使其沿外圆周运动。 使用三角函数&#xff08;如 sin 和 cos&#xff09;来计…

如何带领小微企业在软件开发行业生存

文章目录 前言一、企业急需的技术人才需要掌握的技能二、人工智能开发者技能三、领导者需要掌握的知识和技能四、具备敏锐的技术视野的方法和途径五、人工智能技术论坛及组织六、机器学习相关论坛和组织七、新技术如何应用和落地1、了解新技术2、确定应用场景3、进行实践验证4、…