【Linux】数据流重定向

        数据流重定向(redirect)由字面上的意思来看,好像就是将【数据给它定向到其他地方去】的样子?

        没错,数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据,给它传输到其他的地方,例如文件或是设备(例如打印机之类的)。

        这玩意儿在Linux的命令行模式下面很重要,尤其是如果我们想要将某些数据存储下来时,就更有用了。

1.什么是数据流重定向

什么是数据流重定向?这得要由命令的执行结果谈起。

一般来说,如果你要执行一个命令,通常它会是这样的:



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

在上图当中,standard output 与standard error output分别代表【标准输出(STDOUT)】与【标准错误输出(STDERR)】,这两个玩意儿默认都是输出到屏幕上面来的

那么什么是标准输出与标准错误输出?

        简单地说,标准输出指的是命令执行所返回的正确信息,而标准错误输出可理解为命令执行失败后,所返回的错误信息。

举个简单例子来说,

我们的系统默认有/etc/crontab但却无/etc/birdsay,此时若执行【cat /etc/crontab   /etc/vbirdsay】这个命令时,cat会进行:

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

不管正确或错误的数据都是默认输出到屏幕上,所以屏幕当然是乱的。

那能不能通过某些机制将这两股数据分开?

当然可以,那就是数据流重定向的功能,数据流重定向可以将standard output(简称stdout)与standard error output(简称stderr)分别传送到其他的文件或设备,而分别传送所用的特殊字符则如下所示:

  • 标准输入(stdin):代码为0,使用<或<<;
  • 标准输出(Stdout):代码为1,使用>或>>;
  • 标准错误输出(stderr):代码为2,使用2>或2>>;

2.标准输出流重定向

什么是标准输出重定向?

输出重定向:指的是重新指定设备来代替显示器作为新的输出设备。

2.1. >

[root@zaishu ~]# ls -l > x  不输出到屏幕,输出到文本,这就是输出重定向;另外当指定没有描述符的时候,默认就是标准数据流。
root@zaishu ~]# ls -l 1> x (这两条命令的效果一样 1就是代表标准输出流)

范例一:观察你的系统根目录(/)下各目录的文件名、权限与属性,并记录下来

此时屏幕会显示出文件名信息

屏幕并无任何信息


有个新文件被建立了。
我们打开看看

怪了,屏幕怎么会完全没有数据?这是因为原本【ll /】所显示的数据已经被重定向到~/rootfile文件中了,这个~/rootfile的文件名可以随便你取。

如果你执行【cat ~/rootfile】那就可以看到原本应该在屏幕上面的数据。

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

 它将变成【仅有ll  /home的数据】而已。咦?原本的【ll  /】数据就不见了吗?

是的,因为该文件的建立方式是:

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

2.2.  >> 

那如果我想要将数据累加而不想要将旧的数据删除,那该如何是好?

利用两个大于的符号(>>)就好。

以上面的范例来说,你应该要改成【ll  >> ~/rootfile】即可。

如此一来,当

  • (1)~/rootfile不存在时系统会主动建立这个文件;
  • (2)若该文件已存在,则数据会在该文件的最下方累加进去。

我们接着上面那个例子来讲讲

来总结一下

3.标准错误流重定向 

上面谈到的是标准输出的正确数据,那如果是标准错误的错误数据?

那就通过2>及2>>,同样是覆盖(2>)与累加(2>>)的特性。

 stdout代码是1而 stderr代码是2,所以这个2>是很容易理解的,而如果仅存在>时,则代表默认的代码1,也就是说:

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

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

OK,有些概念之后让我们继续聊一聊这家伙怎么应用吧!

        当你以一般身份执行find这个命令的时候,由于权限的问题可能会产生一些错误信息

例如执行【find /home -name testing】时,可能会产生类似【find:/root:Permission denied】之类的信息,例如下面这个范例:

        范例二:利用一般身份账号查找/home下面是否有名为,bashrc的文件存在.

        下面还有我们之前建立的账号存在,这些账号的根目录你当然不能进入,所以就会有错误及正确数据,好了,

        那么假如我想要将数据输出到 list 这个文件中?

执行【find /home -name.bashrc > list】会有什么结果?

         呵呵,你会发现 list 里面存了刚刚那个【正确】的输出数据,至于屏幕上还是会有错误的信息出现,伤脑筋。

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

范例三:承范例二,将stdout与stderr分别存到不同的文件中

        注意,此时屏幕上不会出现任何信息。因为刚刚执行的结果中,有Permission 的那几行错误信息都会跑到 list_error 这个文件中,至于正确的输出数据则会存到 list_right 这个文件中。

        这样可以了解了吗?如果有点混乱的话,去休息一下再回来看看吧!

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

想象一下,如果我知道错误信息会发生,所以要将错误信息忽略掉而不显示或存储?

这个时候黑洞设备/dev/nul 就很重要了,这个/dev/nul可以吃掉任何导向这个设备的信息。

将上述的范例自定义

范例四:承范例三,将错误的数据丢弃,屏幕上显示正确的数据.


只有 stdout 会显示到屏幕上,stderr 被丢弃了

再想象一下,如果我要将正确与错误数据通通写入同一个文件中?

这个时候就得要使用特殊的写法了。我们同样用下面的案例来说明:

范例五:将命令的数据全部写入名为list 的文件中

错误 ,由于两股数据同时写入一个文件,又没有使用特殊的语法,此时两股数据可能会交叉写入该文件内,造成次序的错乱。所以虽然最终 list文件还是会产生,但是里面的数据排列就会怪怪的,而不是原本屏幕上的输出排序。

 正确 

 正确

        至于写入同一个文件的特殊语法如上表所示,你可以使用2>&1也可以使用&>

4.1.&(重点)

& 是一个描述符,如果在1和2前面不加&,这个时候1和2表示的是普通文件。加了&表示的是重定向到对应的设备。 举例:

  • 1>&2 意思是把标准输出重定向到标准错误,如果是 1>2  表示的是将标准输出重定向到2这个文件。
  • 2>&1 意思是把标准错误输出重定向到标准输出。如果是 2>1  表示的是将标准错误重定向到1这个文件
  • &>filename 意思是把标准输出和标准错误输出都重定向到文件filename中

5.standard input :<与<<

输入重定向:指的是重新指定设备来代替键盘作为新的输入设备;

了解了stder与stdout后,那么那个<又是什么呀?

呵呵,以最简单的语法来说,那就是【将原本需要由键盘输入的数据,改由文件内容来替换】的意思。

5.1.cat

我们先由下面的cat 命令操作来了解一下什么叫做键盘输入吧!

范例六:利用cat命令来建立一个文件的简单流程。

执行后我们输入一些东西


这里按下[ctrl]+d来退出。



由于加入>在cat后,所以这个catfile会被主动地建立,而内容就是刚刚键盘上面输入的那两行数据了。

唔,那我能不能用纯文本文件替换键盘的输入,也就是说,用某个文件的内容来替换键盘的敲击?可以的,如下所示:

范例七:用stdin替换键盘的输入以建立新文件的简单流程。


注意看,这两个文件的大小会一模一样,几乎像是使用cp来复制一般。

        这东西非常有帮助,尤其是用在类似mail这种命令的使用上。

理解<之后,再来则是怪可怕的<< 这个连续两个小于的符号了,它代表的是【结束的输入字符】的意思。

举例来讲:我要用cat直接将输入的信息输出到catfile中,且当由键盘输入eof时,该次输入就结束,那我可以这样做:

输入eof这关键词,立刻就结束而不需要输入[ctrl]+d。且文件里只有这两行,不会存在关键词那一行

看到了吗?利用<<右侧的控制字符,我们可以终止一次输入,而不必按下[crtl]+d来结束,这对程序写作很有帮助。

5.2.<,<<

[root@zaishu ~]# cat  /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
oracle:x:1002:1002::/home/oracle:/bin/bash
[root@zaishu ~]# cat < /etc/passwd  //将passwd内容输给cat,cat然后将内容输出到屏幕
root:x:0:0:root:/root:/bin/bash
...
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
oracle:x:1002:1002::/home/oracle:/bin/bash

 例2. 分界符

[root@zaishu ~]# cat << 0 //遇到0,表示跳出
> a
> b
> c
> 0
a
b
c

例3. 输入 输出一起用
通过重定向 将/etc/passwd 作为输入设备,并输出重定向到 shu.txt,最终实现将 /etc/passwd 文件中内容复制到 shu.txt 。

[root@prometheus ~]# cat < /etc/passwd > shu.txt
[root@prometheus ~]# cat shu.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
prometheus:x:998:996::/home/prometheus:/bin/bash
node_exporter:x:997:995::/home/node_exporter:/bin/bash

 6.为何要使用命令输出重定向?

好了,那么为何要使用命令输出重定向?

我们来说一说吧!

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

·当然还有很多的功能,最简单的就是网友们常常问到的:为何我的root 都会收到系统crontab传来的错误信息?

这个东西是常见的错误,而如果我们已经知道这个错误信息是可以忽略的时候,嗯,【2> errorfile】这个功能就很重要了。了解了吗?

例题
问:  假设我要将echo "error message”以标准错误的格式来输出,该如何处置?
答:
既然有2>&1来将2>转到1>去,那么应该也会有1>&2吧?

        没错,就是这个概念,因此你可以这样做:

  • [dmtsai@study -]$ echo "error message" 1>&2
  • [dmtsai@study -]$ echo "error message" 2> /dev/null 1>&2

你会发现第一条有信息输出到屏幕上,第二条则没有信息,这表示该信息已经通过2>/dev/null丢到垃圾桶中了,可以肯定是错误信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4G LTE 教程 物理通道结构

https://www.artizanetworks.com/resources/tutorials/phy_cha.html 下行物理信道&#xff1a; 物理下行链路共享信道 (PDSCH) 承载 DL-SCH 和 PCH。DL-SCH 包含实际用户数据。物理下行链路控制信道 (PDCCH) 通知UEPCH和DL-SCH的资源分配情况&#xff0c;以及DL-SCH相关的HARQ…

tongweb8 使用命令行对应用进行操作(by lqw)

文章目录 声明思路和概念新增应用更新应用启动应用停止应用删除应用 声明 本帖只是做一些简单的应用查看&#xff0c;新增&#xff0c;启动&#xff0c;停止&#xff0c;删除操作&#xff0c;仅供参考&#xff0c;详细内容建议参考TongwebV8.0 命令行工具参考&#xff0c;生产…

InjectFix 热更新解决方案

简介 今天来谈一谈&#xff0c;项目种的客户端热更新解决方案。InjectFix是腾讯xlua团队出品的一种用于Unity中C#代码热更新热修复的解决方案。支持Unity全系列&#xff0c;全平台。与xlua的思路类似&#xff0c;InjectFix解决的痛点主要在于Unity中C#代码写的逻辑在发包之后无…

Python爬虫:基础爬虫架构及爬取证券之星全站行情数据!

爬虫成长之路&#xff08;一&#xff09;里我们介绍了如何爬取证券之星网站上所有A股数据&#xff0c;主要涉及网页获取和页面解析的知识。爬虫成长之路&#xff08;二&#xff09;里我们介绍了如何获取代理IP并验证&#xff0c;涉及了多线程编程和数据存储的知识。此次我们将在…

深度学习LSTM之预测光伏发电

代码一&#xff1a;训练LSTM模型 代码逐段分析 import numpy as np import pandas as pd import tensorflow.keras as tk from tensorflow.keras import layers首先&#xff0c;导入了必要的库&#xff1a;numpy用于数值计算&#xff0c;pandas用于数据处理&#xff0c;tenso…

k8s record 20240710 监控

不是adaptor 是opetator 案例 监控有了&#xff0c;日志搜集呢&#xff1f; 一、kubelet 的小弟 kubelet — 负责维护容器的生命周期&#xff0c;节点和集群其他部分通信 cAdvisor 集成在 Kubernetes 的 kubelet 中&#xff0c;能够自动发现和监控集群中所有的容器。dockers…

尚硅谷Vue3入门到实战,最新版vue3+TypeScript前端开发教程

Vue3 编码规范 创建vue3工程 基于vite创建 快速上手 | Vue.js (vuejs.org) npm create vuelatest 在nodejs环境下运行进行创建 按提示进行创建 用vscode打开项目 安装依赖 源文件有src 内有main.ts App.vue 简单分析 编写src vue2语法在三中适用 vue2中的date metho…

java《ArrayList篇》--ArrayList全套知识点总结及其配套习题逐语句分析(附带全套源代码)

一、前言 来不及悼念字符串了&#xff0c;接下来登场的是集合&#xff0c;集合和数组的用法差不多&#xff0c;不同之处就在于存储的内容&#xff0c;数组是固定的长度的&#xff0c;集合的长度不固定。学习的过程中可以参照数组 今天已经是学习java的第八天了&#xff0c;接下…

vue3 vite+gojs 2.3.14 去除水印

引用vue2的做法&#xff1a;http://t.csdnimg.cn/Yrz8n 自定义vite插件&#xff0c;插件中apply 分两种模式&#xff0c;如果打包请选择build&#xff0c;记得强制刷新浏览器清缓存采能看到最新的gojs界面 export default function createGojsWaterMaker() {return {name:rem…

FPGA笔试

半加器和全加器的区别&#xff1a; 1、半加器不考虑输入的进位&#xff0c;称之为半加。 2、全加器反之&#xff0c;考虑进位。 SRAM/DRAM优缺点对比_sram和dram的主要区别及优缺点-CSDN博客 消除竞争冒险的方法 ①滤波电容&#xff1a;因为尖峰脉冲很窄&#xff0c;用很小的…

PyFluent入门之旅(5)后处理

接着PyFluent入门之旅&#xff08;4&#xff09;算例求解后我们已经完成了求解&#xff0c;并且保存了.dat的结果文件。 现在可以利用Fluent内置的后处理功能进行图像与数据曲线的输出。 1. 计算结果文件的读取 如果需要在计算完成后立即进行后处理&#xff0c;那么直接在求…

Nginx入门到精通六(高可用配置)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通一&#xff08;基本概念介绍&#xff09;-CSDN博客 Nginx入门到精通二&#xff08;安装配置&#xff09;-CSDN博客 Nginx入门到精通三&#xff08;Nginx实例1&#xff1a;反向代理&a…

【Django+Vue3 线上教育平台项目实战】构建高效线上教育平台之首页模块

文章目录 前言一、导航功能实现a.效果图&#xff1a;b.后端代码c.前端代码 二、轮播图功能实现a.效果图b.后端代码c.前端代码 三、标签栏功能实现a.效果图b.后端代码c.前端代码 四、侧边栏功能实现1.整体效果图2.侧边栏功能实现a.效果图b.后端代码c.前端代码 3.侧边栏展示分类及…

springboot1——快速构建项目

需求 第一步&#xff1a;创建maven工程(非web项目) 第二步&#xff1a;导入起步依赖 点击&#xff1a; 下拉复制&#xff1a; 粘贴&#xff1a;&#xff01;&#xff01;这是springboot工程需要继承的父工程 下拉复制&#xff1a; 粘贴&#xff1a;&#xff01;&#xf…

android13 文件管理器无法安装apk 奔溃问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.我们简单写个apk测试下 3.排查客户apk 4.frameworks源码排查 5.编译验证 6.彩蛋 1.前言 客户提供的文件管理apk不能安装apk文件,一点击就奔溃。 2.我们简单写个apk测试下 private void installApk(File apkFile) {i…

将swagger注解导入apifox的IDEA配置

在使用IDEA开发中&#xff0c;经常需要将后端接口导出到Apifox&#xff0c;以便于测试。将swagger注解内容导出到Apifox中&#xff0c;需要进行以下设置: file->settting打开对话框&#xff0c;选择Other Settings -> Apifox Help&#xff0c;如下图&#xff1a; 2.选…

【JavaWeb程序设计】Servlet(二)

目录 一、改进上一篇博客Servlet&#xff08;一&#xff09;的第一题 1. 运行截图 2. 建表 3. 实体类 4. JSP页面 4.1 login.jsp 4.2 loginSuccess.jsp 4.3 loginFail.jsp 5. mybatis-config.xml 6. 工具类&#xff1a;创建SqlSessionFactory实例&#xff0c;进行 My…

Twelve Labs:专注视频理解,像人类一样理解视频内容

在当今数字化世界中&#xff0c;视频已成为人们获取信息和娱乐的主要方式之一。 AI视频生成领域的竞争也很激烈&#xff0c;Pika、Sora、Luma AI以及国内的可灵等&#xff0c;多模态、视频生成甚至也被视为大模型发展的某种必经之路。然而&#xff0c;与文本生成相比&#xff…

什么ISP?什么是IAP?

做单片机开发的工程师经常会听到两个词&#xff1a;ISP和IAP&#xff0c;但新手往往对这两个概念不是很清楚&#xff0c;今天就来和大家聊聊什么是ISP&#xff0c;什么是IAP&#xff1f; 一、ISP ISP的全称是&#xff1a;In System Programming&#xff0c;即在系统编程&…

【蓄势·致远】 同为科技(TOWE)2024年年中会议

2024年7月2日-8日&#xff0c;同为科技&#xff08;TOWE&#xff09;召开2024年年中工作会议。会议回顾上半年总体工作情况&#xff0c;分析研判发展形势&#xff0c;规划部署下半年工作。 为期一周的工作会议&#xff0c;由同为科技&#xff08;TOWE&#xff09;创始人、董事长…