学习bash——数据流重定向

一、概述

1. 数据流

定义:以规定顺序被读取一次的数据序列。

分类:标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)。

  • 标准输出:指的是命令执行所回传的正确信息。
  • 标准错误输出:指的是命令执行失败后,所回传的错误信息。

2. 文件描述符

定义:在形式上是一个非负整数。实际上,它是一个索引值,所有打开的文件都通过文件描述符引用。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。按照惯例,unix系统shell把文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误输出关联。

Linux 默认提供了三个特殊设备,用于终端的显示和输出。分别为:stdin(标准输入,对应于你在终端的输入),stdout(标准输出,对应于终端的输出),stderr(标准错误输出,对应于终端的输出)。

文件描述符 设备文件 说明
0 /dev/stdin 标准输入
1 /dev/stdout 标准输出
2 /dev/stderr 标准错误

3. 重定向

重定向:重新定个方向转到正确位置。即将标准输出导向一个文件或追加到一个文件中。

重定向描述符:&是一个描述符,若1或2前不加&,会被当成一个普通文件。常见用法如下:

表达式 含义
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误输出重定向到标准输出
&>filename 把标准输出和标准错误输出都重定向到文件filename 中

二、正文

1. 三种数据流重定向

  • 标准输入(stdin):代码为0,使用0<或0<<,其中代码0可以省略
  • 标准输出(stdout):代码为1,使用1>或1>>,其中代码1可以省略
  • 标准错误输出(stderr):代码为2,使用2>或2>>

2. 标准输出(stdout)重定向
我们知道Linux中,cat命令可以将文件内容输出到屏幕。
如下所示:

我们可以使用>将输出重定向到其他文件,如下所示:

可以看到,使用>后,文件内容并没有输出到屏幕,而是输出到了mytxt文件。

  • >>与>的区别是:>>会把输出添加到文件的末尾;>会清空文件,然后将输出写入该文件。

3. 标准错误输出(stderr)重定向
与标准输出(stdout)重定向用法相同,只是将>和>>改为2>和2>>。
表示重定向的是错误信息。
一般用来将错误信息和正确信息分开。

4. 将标准输出(stdout)和标准错误输出(stderr)分别存入不同的文件中
用法:cat test.txt > stdout.txt 2> stderr.txt

评讲:执行此命令后,错误信息都会跑到stderr.txt这个文件中,而正确信息会跑到stdout.txt文件中。屏幕上不显示任何信息。

5. 标准输出和标准错误输出写入同一个文件
使用&>可将stdout和stderr输出到同一个文件,如下所示:

另一种用法:cat test.txt > mytxt 2>&1

6. 丢弃错误信息
有时我们希望将错误信息直接丢弃,而不保存到任一文件中。
此时,可将输出重定向到设备/dev/null。如下所示:

命令:cat mytxt 2> /dev/null

将错误信息吃掉,此时屏幕输出的只有正确信息了。

7. 标准输入(stdin)重定向
命令:cat > mytxt

评讲:加入>在cat后,mytxt会被主动创建,而其内容则可以从键盘输入。

如下所示:

使用<可以将其他文件内容输入到该文件(即将原本需要由键盘输入的数据改由文件内容来替代),如下所示:

使用<<,表示定义输入结束符,
从键盘输入时,输入Ctrl+D,可结束进程。
还可以使用<<自定义结束符,如下所示:

即:利用<<符号,我们可以终止一次输入,而不必输入[Ctrl]+D来结束,这对程序写作很有帮助。

7. 为什么要用数据流重定向
1)需要将屏幕信息保存下来的时候
2)不希望其他程序干扰到当前程序的屏幕输出
3)执行时一些已知的错误,我们可以用"2>/dev/null"丢掉
4)正确信息和错误信息需要分开输出

时间: 2024-10-04 16:02:22

学习bash——数据流重定向的相关文章

第十一章、认识与学习 BASH 数据流重导向

数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给它导向到其他的地方,例如文件或者是装置 (例如打印机之类的)! 什么是数据流重导向 命令运行过程如下: 图 5.1.1.命令运行过程的数据传输情况 运行一个命令的时候,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上. 在上图当中, standard output 与 standard error output 分别代表『标准输出』与『标准错误输出』, 它们默认都是输出到屏幕! standard output 与 st

1.10数据流重定向(学习过程)

数据流重定向 实验介绍 你可能对重定向这个概念感到些许陌生,但你应该在前面的课程中多次见过>或>>操作了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中.这其实就是重定向,将原本输出到标准输出的数据重定向到一个文件中,因为标准输出(/dev/stdout)本身也是一个文件,我们将命令输出导向另一个文件自然也是没有任何问题的. 一.数据流重定向 下面我们简单的回顾一下我们前面经常用到的两个重定向操作: $ echo 'hello shiyanlou' > redirect

第十一章、认识与学习 BASH

1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 shell 与 /etc/shells 功能 1.4 Bash shell 的功能 1.5 Bash shell 的内建命令: type 1.6 命令的下达 2. Shell 的变量功能 2.1 什么是变量? 2.2 变量的取用与配置:echo, 变量配置守则, unset 2.3 环境变量的功能: env 与常见环境变量说明, set, export 2.4 影

轻松学习之Linux教程五 认识与学习bash

本系列文章由@超人爱因斯坦出品,转载请注明出处.          文章链接:          http://hpw123.net/a/Linux/Linuxjichu/2014/1031/101.html          作者:超人爱因斯坦    个人网站:http://www.hpw123.net     邮箱: [email protected] CSDN:http://blog.csdn.net/u010283694 在Linux的环境下,如果你不懂bash是什么,那么其他的东西就不

《学习bash》笔记--命令行处理

shell从标准输入或脚本中读取的每行称为一个管道行,它包含一或多个由0个或多个管道符分割的命令,对其读取的每个管道 行,执行下面的操作. 1.将命令分成由固定元字符集分隔的记号:SPACE.TAB.NEWLINE.;.(.).<.>.|和&.记号类型 包括单词.关键字.I/O重定向符和分号. 2.检测每个命令的第一个记号,查看为不带引号或反斜线的关键字.如果是一个开放的关键字,如if和 其他控制结构起始字符串.function.{或(,则命令实际上为一复合命令.shell在内部对复合

鸟哥的Linux私房菜笔记6------11章认识和学习bash

1.合法的shell与/etc/shells功能 shell有多个版本,有Bourne Shell(sh).C Shell.K Shell .TCSH等.通常Linux使用的是Bourne Again Shell(Bash),是sh的增强版 可以检查/etc/shells,查看有多少可用的shell. 将合法的shell写入/etc/shells文件,是为系统某些服务在运行过程中检查用户能够使用的shells. 当用户登录时就会取得一个shell来工作,这个shell记录在/etc/passwd

《学习bash》笔记--输入输出

1.I/O重定向符 I/O重定向符如下: cmd1 | cmd2:管道,接收cmd1的标准输出作为cmd2的标准输入. >file:将标准输出定向到file <file:从file接收标准输入 >>file:将标准输出定向到file,如果file存在则附加在后面 >|file:即使设置了noclobber仍然强制标准输出到file. shell提供了一种称为noclobber的特性,该特性可防止重定向时不经意地重写了已存在的文件.通过设置变量noclobber可以 将此特 性

鸟哥的Linux私房菜_基础版_学习笔记7:第十一章 认识与学习 BASH

11.1 认识 BASH 这个 Shell 图 1.1.1.硬件.核心与用户的相关性图示 11.1.4 Bash shell 的功能 既然 /bin/bash 是 Linux 默认的 shell ,bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux distributions 的标准 shell . bash 主要兼容于 sh ,并且依据一些使用者需求,而加强的 shell 版本.不论你使用的是那个 distribution ,你都难逃需要学习 bash 的宿命啦!那么这个 s

学习bash——通配符与特殊符号

一.通配符 这是bash操作环境中一个非常有用的功能,这让我们使用bash处理数据就更方便了. 常用通配符如下: 符号 意义 * 代表0个到无穷多个任意字符 ? 代表一个任意字符 [] 代表一定有一个在中括号内的字符(非任意字符) [-] 若有减号在中括号内,代表在编码顺序内的所有字符 [^] 若中括号内的第一个字符为^,则表示原向选择 [示例区] 预处理:LANG=C; alias ll=ls -al 题目1:找出/etc/下面以cron为开头的文件名 命令:ll -d /etc/cron*