Linux之数据流重导向

其实一开始绕进文件描述符这个大坑里去了,越挖越深,什么系统文件表,内存索引节点,VFS等等都一下子冒了出来,而我暂时还没那么多精力搞定所有,于是只能屏蔽底层的一些细节,暂且当作黑盒子,来日再挖。。。

1、Linux系统中,一切资源都被视为文件,包括放在磁盘上的各种文档图片,甚至各种设备。文件是Linux组织计算机硬件资源的基本逻辑单位。

2、进程,具体的说就是我们敲的所有命令,本质上就是在操作一系列文件,接着产生一系列结果。比如常用的ls命令,后面不加参数时,操作对象默认为是当前目录(目录也是文件——目录文件),然后把该目录下的所有文件的名字输出到屏幕上(屏幕也是文件啊衰~)。

3、操作的结果有两种,一种是正确的结果,另一种是错误的结果。Linux把前者称为标准输出,其文件描述符是1;后者称为标准错误输出,对应的文件描述符是2。这两类结果信息是分开的。默认情况下,这两类信息都会输出到屏幕上,让操作着直接、立即看到,然后阅后即焚。如果我们想把这两类信息保存下来方便以后复习,就需要用到重导向了。

4、比如我的家目录是这样子的:

[email protected]:~$ ls

desktop  program  wine-git  公共  模板  视频  图片  文档  下载  音乐  桌面

默认情况下结果直接打印到屏幕上。

那现在我想把结果保存到file1这个文件中,就可以这样:

[email protected]:~$ ls > file1

ls一下,就会发现当前目录多了一个文件file1:

[email protected]:~$ ls

desktop  file1  program  wine-git  公共  模板  视频  图片  文档  下载  音乐  桌面

这里需要注意:1)如果当前目录没有file1文件,那么它就会被新建;如果已经存在一个名叫file1的文件,那么之前的内容会被覆盖。

2)> 前面如果没有数字,则默认为1,即标准输出。

看一下file1的内容:

[email protected]:~$ cat file1

desktop

file1

program

wine-git

公共

模板

视频

图片

文档

下载

音乐

桌面

这里要注意的是,file1文件名本身也在file1的内容里,这说明了什么呢?对的,顺序问题。

5、我们试一下这样:

[email protected]:~$ ls program/ nothing

ls: 无法访问nothing: 没有那个文件或目录

program/:

google-chrome-stable_current_i386.rpm

显然,把nothing作为ls的参数就会显示错误,因为当前目录下并没有这个文件。那么现在把这两个信息分别保存在right和wrong文件中,就可以这样:

[email protected]:~$ ls program/ nothing >right 2>wrong

检查一下:

[email protected]:~$ cat right

program/:

google-chrome-stable_current_i386.rpm

[email protected]:~$ cat wrong

ls: 无法访问nothing: 没有那个文件或目录

6、那我想把正确信息和错误信息保存在同一文件中呢?可以这样:

[email protected]:~$ ls program/ nothing &> all

检查一下:

[email protected]:~$ cat all

ls: 无法访问nothing: 没有那个文件或目录

program/:

google-chrome-stable_current_i386.rpm

7、还有一种方法也可以把正确信息和错误信息保存在同一文件中:

[email protected]:~$ ls program/ nothing > all 2>&1

解释一下这种用法:首先,> all就是1> all,即把标准输出重定向到all文件中;然后2>表示把标准错误也重定向,但是重定向到哪儿呢?那么&1就表示重定向到文件描述符1所指向的那个文件,这种用法其实类似于变量,为了方便而已。

检查一下:

[email protected]:~$ cat all

ls: 无法访问nothing: 没有那个文件或目录

program/:

google-chrome-stable_current_i386.rpm

显然上面的用法和这个是一样的道理:

[email protected]:~$ ls program/ nothing 2> all 1>&2

一开始我也不明白,为什么像这样就不行呢?

[email protected]:~$ ls program/ nothing 2> all 1>all

多直观多明了啊,但是是错的。。。

[email protected]:~$ cat all

program/:

google-chrome-stable_current_i386.rpm

?录

原因嘛。。。据说是因为标准输出和标准错误交替写入all文件时,由于没有规定谁先谁后,于是就乱码。而2> all 1>&2这种办法,本质上是调用dup(2)这个系统函数复制了前面的行为,总之很复杂,先不管了。

8、如果这样会怎样?

[email protected]:~$ ls program/ nothing  1>&2 2> all

自己试试吧,还是顺序问题。

时间: 2024-10-06 22:37:28

Linux之数据流重导向的相关文章

【Linux】数据流重导向(前篇)

数据流重导向 (redirect) 由字面上的意思来看,好像就是将『数据给他传导到其他地方去』的样子? 没错-数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方,例如文件或者是装置 (例如打印机之类的)!这玩意儿在 Linux 的文本模式底下可重要的! 尤其是如果我们想要将某些数据储存下来时,就更有用了! 1)什么是数据流重导向? 什么是数据流重导向啊?这得要由命令的运行结果谈起!一般来说,如果你要运行一个命令,通常他会是这样的: 我们运行一个命令的时候,这个命令可

【Linux】数据流重导向(后篇)

1)/dev/null 垃圾桶黑洞装置与特殊写法 想象一下,如果我知道错误信息会发生,所以要将错误信息忽略掉而不显示或储存呢? 这个时候黑洞装置 /dev/null 就很重要了!这个 /dev/null 可以吃掉任何导向这个装置的信息喔!将上述的范例修订一下: 范例四:承范例三,将错误的数据丢弃,屏幕上显示正确的数据 [[email protected] ~]$ find /home -name .bashrc 2> /dev/null /home/dmtsai/.bashrc <==只有 s

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

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

Centos6笔记 -- 数据流重导向(Redirection)

1. 数据流重导向的介绍 谈到数据流重定向,这里需要说明流的概念,就比如说我需要运行一个命令,就可能会有以下流的情况发生: 在运行一个命令时,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上. 在上图当中, standard output 与 standard error output 分别代表标准输出与标准错误输出,这两个输出流默认都是输出到屏幕上面的.标准输出指的是命令运行所回传的正确的信息,而标准错误输出可理解为命令运行失败后,所回传的错误信息. 如果我们希望这种输出流可以

数据流重导向[转]

数据流重导向 数据流重导向 (redirect) 由字面上的意思来看,好像就是将『数据给他传导到其他地方去』的样子? 没错-数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方,例如文件或者是装置 (例如打印机之类的)!这玩意儿在 Linux 的文本模式底下可重要的! 尤其是如果我们想要将某些数据储存下来时,就更有用了! 什么是数据流重导向 什么是数据流重导向啊?这得要由命令的运行结果谈起!一般来说,如果你要运行一个命令,通常他会是这样的: 图 5.1.1.命令运行过

关于bash中的数据流重导向

由来: 当我们执行一个指令时,可能会访问档案和执行一些讯息后将一些信息显示到屏幕上,而重定向就是将如此的的讯息导向到其他文件中,事实上,默认的其实就是数据导向到屏幕文件,只是将其重定向到你指定的文件中 输入输出方式: 标准输入 (stdin):代码为0,使用<(覆盖标准输入)或<<(累加标准输入) 标准输出 (stdout):代码为1,使用>(覆盖式标准输出)或>>(累加式标准输出) 标准错误输出 (stderr):代码为2,使用2>(覆盖式标准错误输出)或2&g

【Linux】双向重导向命令tee

想个简单的东西,我们知道 > 会将数据流整个传送给文件或装置,因此我们除非去读取该文件或装置, 否则就无法继续利用这个数据流.万一我想要将这个数据流的处理过程中将某段信息存下来,应该怎么做? 利用 tee 就可以-我们可以这样简单的看一下: tee 会同时将数据流分送到文件与屏幕 (screen):而输出到屏幕的,其实就是 stdout ,可以让下个命令继续处理! [[email protected] ~]# tee [-a] file 选项与参数: -a :以累加 (append) 的方式,将

Linux学习资料-命令重导向

命令重导向 基本上,这个子题是 bash 相当重要的观念,这里可得花点心思才行呦!什么是『重导向, redirect ?』:简单的说,就是将你目前的所得资料转到其它地方去就是了!例如我们常用的,将目前的屏幕输出数据转到档案中去,就可以这么写:『ls -l / > test 』,那个大于的符号『 > 』就是将输出结果导向到 test 这个档案中的意思啰!这个时候: 如果你执行『 ls -l / 』而已的话,屏幕会将根目录的档案与目录都列出在屏幕上: 但是当使用 > 导向到 test 这个档

linux输出数据流

[[email protected] ~]$ find /home -name .bashrc > list 2>&1   <==正确 [[email protected] ~]$ find /home -name .bashrc &> list       <==正确 /dev/null 垃圾桶黑洞装置与特殊写法 1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上: 1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上: