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

这篇具有很好参考价值的文章主要介绍了数据流重定向(>,>>)(<,<<)(2>,2>>)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据流重定向

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

什么是数据流重定向

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

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

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

标准输出(>,>>)与标准错误输出(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丢掉了垃圾桶中了,可以肯定的是错误信息文章来源地址https://www.toymoban.com/news/detail-425706.html

到了这里,关于数据流重定向(>,>>)(<,<<)(2>,2>>)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据流图(DFD)

    数据流图是用于表示系统逻辑模型的一种工具。从数据 传递和加工 的角度,以图形的方式描述数据在系统中流动和处理的过程 数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑等进行定义和描述,其目的是 对数据流图中的各个元素做出详细的说明 ,

    2024年02月04日
    浏览(33)
  • postman 数据流请求

    备注: Postman version : Version 9.21.3 Windows 版本 1.修改headers 2.Body 部分 选择raw 格式数据 3.最后执行请求

    2024年02月11日
    浏览(53)
  • Flink数据流

    官网介绍 Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink 被设计为在所有常见的集群环境中运行,以内存中的速度和任何规模执行计算。 1.无限流有一个开始,但没有定义的结束。它们不会在生成数据时终止并提供数据。必须连续处

    2024年02月17日
    浏览(35)
  • Java文件读写数据流

    以下这几个类都是抽象类.并且都有对于文件操作的具体实现类.File+类名就是具体的实现类 1.1.1.InputStream 以二进制方式读.有两个主要方法. 1.read(); 该方法有三个版本 无参: read() 读取一个字节的数据,返回 -1 表示读取结束 一个参数: read(byte[] b) 最多读取 b.length 字节的数据到 b

    2024年02月16日
    浏览(31)
  • C# 数据流 FileStream

     

    2024年03月24日
    浏览(33)
  • nginx 转发数据流文件

    1.问题描述 后端服务,从数据库中查询日志,并生成表格文件返回静态文件。当数据量几兆时,返回正常,但是超过几十兆,几百兆,就会超过网关的连接超时时间30秒。 时序图  这里面主要花费时间的地方在: 1后台服务器,将数据格式化,写到本地的文件的过程 2后台服务

    2024年02月06日
    浏览(31)
  • 指令流和数据流

    指令流和数据流 Flynn于1972年提出计算平台分类法主要根据指令流和数据流来分类,分为四类: ①单指令流单数据流机器(S1SD) SISD机器是一种传统的串行计算机,它的硬件不支持任何形式的并行计算,所有的指令都是串行执行。并且在某个时钟周期内,CPU只能处理一个数据流

    2024年02月04日
    浏览(42)
  • 实时数据处理:数据流的安全与隐私

    实时数据处理在现代大数据环境中具有重要意义。随着互联网的普及和人们对数据的需求不断增加,实时数据处理技术已经成为了企业和组织的核心技术之一。然而,随着数据处理技术的不断发展,数据流的安全与隐私也成为了一个重要的问题。在这篇文章中,我们将深入探

    2024年02月20日
    浏览(39)
  • SAST-数据流分析方法-理论

    众所周知,数据流分析是实现污点分析的一种常用技术 数据流分析分为过程内的数据流分析与过程间的数据流分析。前者是对一个方法体内的数据流分析,主要是基于CFG分析,不涉及方法调用;后者是基于不同方法间的数据流分析,主要是基于ICFG+CG分析,会涉及方法调用。

    2024年04月08日
    浏览(34)
  • Python之数据流(stream)

    大家好!我是晨晨💓 希望大家多多支持我! 为了感谢每一个关注我的小可爱:💓文章留言“学习”即可获取晨晨精心准备的学习大礼包书籍教程,都是无偿分享滴💓 最后——如果文章有帮助到你,记得“关注”、“点赞”、“评论”三连哦~ —————————————

    2024年02月02日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包