5 数据流重导向

何为数据流重导向:将数据重新传递到其他地方去
那我们的数据一般传输去哪?屏幕啊!大多数情况下我们执行的命令数据最后都会传递到我们的屏幕,那我们可以传递到其他地方吗?当然可以,这就是我们这章要学的

什么是数据流重导向

要理解什么是数据路重导向,首先需要了解一下命令的运行结果,下图5.1展示了命令运行过程的数据传输情况


图5.1

我们在Bash当中运行一个命令的时候,这个命令可能会由文件读取数据,经过处理之后,再将数据输出到屏幕上。图中 standard outputstandard output error 分别代表了 标准输出标准错误输出

Standard output 与 Standard error output

简单理解
标准输出:命令运行所回传的正确的信息
标准错误输出:命令运行失败后,所回传的错误信息

不管是正确或者是错误的数据都是默认输出到屏幕上,这不是我们想要的,一班正确的内容就是我们想看到的内容,而错误的内容我们就像保留下方便修改,由此可以通过特殊字符将信息传递到别的地方去:

# 例子1:将错误的输出信息存储到 stderr文件中
[tanzitao@master ~]$ cat test.txt an.txt 2> stderr  <-- 将错误的数据重导向到文件中
this is a test file                                 <-- 正确的内容打印在了屏幕上
[tanzitao@master ~]$ cat stderr                     <-- 查看保留错误的文件
cat: an.txt: 没有那个文件或目录                      <-- 错误的内容保留在了文件内

一般常用的几个数据导向需要记住:

  • 1>: 以覆盖的方法将[正确的数据] 输出到指定的文件或者装置上
  • 1>>: 以累加的方法将[正确的数据] 输出到指定的文件或者装置上
  • 2>: 以覆盖的方法将[错误的数据] 输出到指定的文件或者装置上
  • 2>>: 以累累加的方法将[错误的数据] 输出到指定的文件或者装置上

需要注意的是 1>>2>> 中间是没有空格的

/dev/null 垃圾桶黑洞装置与特殊写法

想象一下,如果我知道错误信息会发生,所以就是要将错误信息忽略掉不显示呢?这个时候黑洞装置 /dev/null 就很重要了,因为所有的内容都会被扔掉

# 例子2:将错误的输出信息存扔掉不显示
[tanzitao@master ~]$ find /home -name .bashrc               <-- 直接查询所有创建的账号
find: ‘/home/tzz’: 权限不够                                  <-- 因为这些账号不是我们创建的所以不能进入
/home/tanzitao/.bashrc
[tanzitao@master ~]$ find /home -name .bashrc 2> /dev/null   <-- 附带条件,将错误的信息全部扔到 /dev/null 里
/home/tanzitao/.bashrc                                       <-- 只显示一条

如果我们既要保留正确命令又要保留错误的命令,并且写入同一文件,那么就需要参考以下正确写法

# 例子3:将输出的内容输入到同一文件
[tanzitao@master ~]$ find /home -name .bashrc > list 2> list    <-- 错误写法
[tanzitao@master ~]$ find /home -name .bashrc > list 2>&1  2>&1 <-- 语法正确
[tanzitao@master ~]$ find /home -name .bashrc &> list           <-- 正确

standard input : < 与 <<

在了解到 stderr与stdout后,那个 <<< 又代表什么意思呢?
简单来说就是[将原本需要键盘输入的数据,改为有文件内容来取代]。我们先来了解下什么是键盘输入

# 例子4:使用键盘输入创建文件
[tanzitao@master ~]$ cat > catfile     <-- 利用 [>] 创建文件并向里输入内容
test                                   <-- 一下都是输入的内容
this
file
is
catfile

由于加入 > 在cat之后,所以catile会被主动创建,而内容就是键盘敲的数据,只不过

# 例子5:使用[cat]直接将输入信息输出到[catfile]中,且当由键盘输入eof的时候,该次输入就结束
[tanzitao@master ~]$ cat > catfile << "eof"
> test              <-- 以下是输入内容
> this is a file
> eof               <-- 遇到暂停符就退出输入流入

命令运行的判断依据

在某些情况下,许多的命令我想要一次输入去运行,而不是分多次运行,那该怎么办呢?一种可以通过 shell script 撰写脚本运行,另一种是通过 ; 或者 | 间隔开内容达到一次输入都条指令的形式

[cmd ; cmd] (不考虑命令相关性的连续命令下达)

在命令与命令之间利用分号(;)隔开,这样一来,分号前的命令运行完后就会立刻执行后面的任务,往往这些命令之间没有太大的关联性,例如我们需要先更新我们的下载器,再进行模块的下载

例子1:更新下载apt-get;利用apt-get下载内容
[tanzitao@master ~]$ apt-get update; apt install ninja-build <-- 以顿号分隔,不用考略之间的连续性

$? (命令回传值)与 && 和 ||

"有相关联性的连续命令"主要判断依据就是:前一个命令是否正确运行的对于后一指令是否有影响

若上一条命令运行结果正确,那么Linux底下会回传一个 $? = 0 的回传值。有了回传值的结果就能用 &&|| 判断后续的命令是否运行

命令下达情况 说明
cmd1 && cmd2 1. 若cmd1运行完毕且正确运行 ( ? = 0 ),则开始运行 c m d 2 < b r / > 2. 若 c m d 1 运行完毕且为错误( ?=0),则开始运行cmd2<br/>2. 若cmd1运行完毕且为错误 ( ?=0),则开始运行cmd2<br/>2.若cmd1运行完毕且为错误(?!=0),则cmd2不运行
cmd1 || cmd2 1. 若cmd1运行完毕且正确运行($?=0),则cmd2不运行
2. 若cmd1运行完毕且为错误,则开始运行cmd2
  • ps cmd1和cmd2都是命令

下面做一个测试:
(1)先判断一个目录是否存在;
(2) 若存在才在该目录底下创建一个文件

例子1:使用ls查阅目录 /test/abc 是否存在,如果存在就在该目录下创建 touch.txt 文件
[tanzitao@master ~]$ ls test/abc && touch test/abc/touch.txt
ls: 无法访问test/abc: 没有那个文件或目录            <-- 直接报错 显示没有该文件,但是没有touch的错误,表示touch并没有运行
[tanzitao@master ~]$ mkdir test/abc               <-- 在test目录下创建abc文件夹
[tanzitao@master ~]$ ls test/abc && touch test/abc/touch.txt  <-- 成功执行且没有报错
[tanzitao@master ~]$ ls test/abc
touch.txt                                          <-- 文件夹下创建了 touch.txt 文件例子2:紧接着上面一步,报错的时文件不是不存在吗?那我们换一条命令,如果文件夹不存在,那就生成一个文件夹
[tanzitao@master ~]$ ls test/abc || mkdir test/abc
ls: 无法访问test/abc: 没有那个文件或目录
[tanzitao@master ~]$ ls test/
abc例子3:我不清楚 test/abc 文件夹是否存在,但是我想创建 test/abc/touch.txt
[tanzitao@master ~]$ ls test/abc || mkdir test/abc && touch test/abc/touch.txt     <-- 结合例子1和2的语句
ls: 无法访问test/abc: 没有那个文件或目录                                             <-- 会报错因为 ls查询错误
[tanzitao@master ~]$ ls test/abc/
touch.txt                                                                           <-- 命令执行成功

例子3无论在什么情况下都能成功运行,我们可以分析下这是为什么?

  • (1)如果 test/abc 文件夹不存在,查询文件夹命令: ls test/abc 执行错误,返回 $?!=0,(2)因为 || 存在的缘故,执行创建文件夹命令: mkdir test/abc所以回传 $?=0,(3)因为 && 遇到 $?=0 的缘故,会执行创建文件语句: touch test/abc/touch.txt,(4)最终文件创建成功
  • (2)如果 test/abc 文件夹存在,查询文件夹命令: ls test/abc 执行正确,返回 $?=0,(2)因为 || 存在的缘故,不会执行创建文件夹命令,(3)因为 && 遇到 $?=0 的缘故,会执行创建文件语句: touch test/abc/touch.txt,(4)最终文件创建成功

总的来说,这样的语句能够极大的方便我们对文件或者信息查询进行操作,不用走一步看一步,在特别庞大的程序中,往往我们对于命令注重的只有结果,因此一定要好好记牢这两种命令运行的判断依据

Linux的Bash——(五)数据流重导向相关推荐

  1. 数据流重导向 -- 第11章   认识与学习 BASH

    http://zhumeng8337797.blog.163.com/blog/static/10076891420104215439296/ 1>&2 正确返回值传递给2输出通道 &a ...

  2. Linux的 Bash 简介和使用方法

    目录 Shell 的作用 shell的分类 基本使用 变量相关 特殊符号 数据流重导向 /dev/null 垃圾桶黑洞设备 管线命令 文本分析/摘取命令 cut grep Bash是shell的一种. ...

  3. Linux中bash

    1 查看可以使用的shell 2 查看命令是内置还是外部 3 shell变量 3.1 变量的显示: 3.2 变量的设置 3.3 变量取消 3.4 环境变量 3.5 自定义变量转环境变量 3.6 变量从 ...

  4. 默认标准错误文件linux,Linux中标准输出和标准错误的重导向

    若是一个命令须要长时间在服务器上运行,那么不少时候会用到nohup命令,这时即使远程登陆ssh中断了与服务器的联系,那么在服务器上运行的命令也不会所以而被迫中止.shell 一般状况下,nohup与& ...

  5. Linux学习系列五:Shell命令脚本的基本语法

    这个系列的Linux教程主要参考刘遄老师的<Linux就该这么学>.用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间 ...

  6. Linux网络编程-五

    Linux网络编程-五 1 线程池并发服务器 2 UDP通信 2.1TCP和UDP的区别 2.2 UDP通信相关函数介绍: 2.3 UDP的服务器和客户端编码流程 2.4 代码练习 3 本地socke ...

  7. 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)

    大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程. 目录 前言 一.Shell 脚本基础说明 1.1 什么是 Shell 脚本 1.2 Shell 脚本的 ...

  8. Linux入门第五集!MySQL8在Linux上的安装!MySQL的Linux资源分享!

    Linux入门第五集!MySQL8在Linux上的安装!MySQL的Linux资源分享! 一.Mysql的Linux版本下载! 博主采用的是mysql-8.0.25-1.el7.x86_64.rpm- ...

  9. Linux 下的五种 IO 模型

    Linux 下的五种 IO 模型 来源:decaywood's Blog 概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2 ...

最新文章

  1. 【CMake】CMake 引入 ( Android Studio 创建 Native C++ 工程 | C/C++ 源码编译过程 | Makefile 工具 | CMake 引入 )
  2. what are the added values for the research?
  3. linux 搭建github,github在linux上的环境搭建-Go语言中文社区
  4. win7修改系统字体时需要修改的项目
  5. Currency determination callback
  6. 关于vscode插件autoprefixer 3.0无法使用的问题
  7. c++自由读写配置ifstream(一)
  8. android监听键盘的隐藏,Android监听软键盘的显示和隐藏
  9. PHP Ctype函数(转)
  10. stdafx.h头文件代码
  11. php调用纯真ip,PHP调用纯真IP数据库返回具体地址
  12. origin软件画流程图_免费的网络拓扑流程图绘制软件(PaceStar LanFlow)
  13. 测试网络连通性的PING命令
  14. Python发送多附件邮件的方法
  15. 网络、如何通信、TCP/IP协议
  16. ArcMap中的各种GIS文件的变换(img转tif,tif坐标系转换,shp坐标系转换)
  17. 开源巨献:Google最热门的40款开源项目
  18. Day13零基础入门python第019讲课后测试题及答案:我的地盘听我的
  19. 概念建模(CDM)-------数据建模(一)
  20. 计算机多媒体对语文教学的提高,运用多媒体进行语文教学,有效提高学习效率...

热门文章

  1. 《Android/OPhone 开发完全讲义》已出版,现提供源代码下载
  2. RocketMQ安装
  3. 如何在自己的网站上添加HTML悬浮音乐播放器?
  4. PDF.js对打印、下载按钮做限制,pdf文件加水印
  5. z77主板可以用nv_性价比无敌手!七彩虹Z77 X3主板评测
  6. 解决迅雷VIP尊享版、极速版、低版本崩溃修正补丁无法安装的问题
  7. 快递鸟物流接口的调用
  8. linux Makefile PHONY作用
  9. java 访问linux 根目录_paip兼容windows与linux的java类根目录路径的方法 | 学步园
  10. linux 允许非root用户使用1024以下端口