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

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

  1)什么是数据流重导向?

  什么是数据流重导向啊?这得要由命令的运行结果谈起!一般来说,如果你要运行一个命令,通常他会是这样的:

  我们运行一个命令的时候,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上。 在上图当中, standard output
与 standard error output 分别代表『标准输出』与『标准错误输出』,
这两个玩意儿默认都是输出到屏幕上面来的啊!那么什么是标准输出与标准错误输出呢?

  2)standard output 与 standard error
output

  简单的说,标准输出指的是『命令运行所回传的正确的信息』,而标准错误输出可理解为『
命令运行失败后,所回传的错误信息』。举个简单例子来说,我们的系统默认有 /etc/crontab 但却无 /etc/vbirdsay,
此时若下达『 cat /etc/crontab /etc/vbirdsay 』这个命令时,cat 会进行:

  • 标准输出:读取 /etc/crontab 后,将该文件内容显示到屏幕上;

  • 标准错误输出:因为无法找到 /etc/vbirdsay,因此在屏幕上显示错误信息

  不管正确或错误的数据都是默认输出到屏幕上,所以屏幕当然是乱乱的!那能不能透过某些机制将这两股数据分开呢?
当然可以啊!那就是数据流重导向的功能啊!数据流重导向可以将 standard output (简称 stdout) 与 standard error
output (简称 stderr) 分别传送到其他的文件或装置去,而分别传送所用的特殊字符则如下所示:

  1. 标准输入  (stdin) :代码为 0 ,使用 < 或 << ;

  2. 标准输出  (stdout):代码为 1 ,使用 > 或 >> ;

  3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

  为了理解 stdout 与 stderr ,我们先来进行一个范例的练习:


范例一:观察你的系统根目录 (/) 下各目录的文件名、权限与属性,并记录下来
[[email protected] ~]# ll / <==此时屏幕会显示出文件名信息

[[email protected] ~]# ll / > ~/rootfile <==屏幕并无任何信息
[[email protected] ~]# ll ~/rootfile <==有个新档被创建了!
-rw-r--r-- 1 root root 1089 Feb 6 17:00 /root/rootfile

  怪了!屏幕怎么会完全没有数据呢?这是因为原本『 ll / 』所显示的数据已经被重新导向到 ~/rootfile 文件中了! 那个 ~/rootfile
的档名可以随便你取。如果你下达『 cat ~/rootfile 』那就可以看到原本应该在屏幕上面的数据啰。 如果我再次下达:『 ll /home >
~/rootfile 』后,那个 ~/rootfile 文件的内容变成什么? 他将变成『仅有 ll /home 的数据』而已!咦!原本的『 ll /
』数据就不见了吗?是的!因为该文件的创建方式是:

  1. 该文件 (本例中是 ~/rootfile) 若不存在,系统会自动的将他创建起来,但是

  2. 当这个文件存在的时候,那么系统就会先将这个文件内容清空,然后再将数据写入!

  3. 也就是若以 > 输出到一个已存在的文件中,那个文件就会被覆盖掉啰!

  那如果我想要将数据累加而不想要将旧的数据删除,那该如何是好?利用两个大于的符号 (>>)
就好啦!以上面的范例来说,你应该要改成『 ll / >>
~/rootfile 』即可。 如此一来,当 (1) ~/rootfile 不存在时系统会主动创建这个文件;(2)若该文件已存在,
则数据会在该文件的最下方累加进去!

  上面谈到的是 standard output 的正确数据,那如果是 standard error output 的错误数据呢?那就透过 2> 及
2>> 啰!同样是覆盖 (2>) 与累加 (2>>) 的特性!我们在刚刚才谈到 stdout 代码是 1 而 stderr 代码是
2 , 所以这个 2> 是很容易理解的,而如果仅存在 > 时,则代表默认的代码 1 啰!也就是说:

  • 1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上;

  • 1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上;

  • 2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上;

  • 2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上;

  要注意喔,『 1>> 』以及『 2>> 』中间是没有空格的!OK!有些概念之后让我们继续聊一聊这家伙怎么应用吧!
当你以一般身份运行 find 这个命令的时候,由于权限的问题可能会产生一些错误信息。例如运行『 find / -name testing 』时,可能会产生类似『 find: /root:
Permission denied 』之类的信息。 例如底下这个范例:


范例二:利用一般身份账号搜寻 /home 底下是否有名为 .bashrc 的文件存在
[[email protected] ~]# su - dmtsai <==假设我的系统有名为 dmtsai 的账号
[[email protected] ~]$ find /home -name .bashrc <==身份是 dmtsai 喔!
find: /home/lost+found: Permission denied <== Standard error
find: /home/alex: Permission denied <== Standard error
find: /home/arod: Permission denied <== Standard error
/home/dmtsai/.bashrc <== Standard output

  由于 /home 底下还有我们之前创建的账号存在,那些账号的家目录你当然不能进入啊!所以就会有错误及正确数据了。
好了,那么假如我想要将数据输出到 list 这个文件中呢?运行『 find /home -name .bashrc > list 』
会有什么结果?呵呵,你会发现 list 里面存了刚刚那个『正确』的输出数据,
至于屏幕上还是会有错误的信息出现呢!伤脑筋!如果想要将正确的与错误的数据分别存入不同的文件中需要怎么做?

范例三:承范例二,将 stdout 与 stderr 分存到不同的文件去
[[email protected] ~]$ find /home -name .bashrc > list_right 2> list_error

  注意喔,此时『屏幕上不会出现任何信息』!因为刚刚运行的结果中,有 Permission 的那几行错误信息都会跑到 list_error
这个文件中,至于正确的输出数据则会存到 list_right 这个文件中啰!这样可以了解了吗? 如果有点混乱的话,去休息一下再来看看吧!

  to be continued~

  参考资料:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash.php#redirect

【Linux】数据流重导向(前篇),布布扣,bubuko.com

时间: 2025-01-22 05:15:58

【Linux】数据流重导向(前篇)的相关文章

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

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

数据流重导向[转]

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

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

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

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

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

Linux之数据流重导向

其实一开始绕进文件描述符这个大坑里去了,越挖越深,什么系统文件表,内存索引节点,VFS等等都一下子冒了出来,而我暂时还没那么多精力搞定所有,于是只能屏蔽底层的一些细节,暂且当作黑盒子,来日再挖... 1.Linux系统中,一切资源都被视为文件,包括放在磁盘上的各种文档图片,甚至各种设备.文件是Linux组织计算机硬件资源的基本逻辑单位. 2.进程,具体的说就是我们敲的所有命令,本质上就是在操作一系列文件,接着产生一系列结果.比如常用的ls命令,后面不加参数时,操作对象默认为是当前目录(目录也是文

关于bash中的数据流重导向

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

鸟哥的 Linux 私房菜Shell Scripts篇(一)

12.1 什么是 Shell scripts 什么是 shell script (程序化脚本) 呢?就字面上的意义,我们将他分为两部份. 在" shell"部分,我们在 十章的 BASH 当中已经提过了,那是一个命令行下面让我们与系统沟通的一个工具接口.那么" script "是啥? 字面上的意义, script 是"脚本.剧本"的意思.整句话是说,shell script 是针对 shell 所写的"剧本!"什么东西啊?其实

当时学习《鸟哥的Linux私房菜-基础学习篇》记录的点

1.当执行一个指令的时候,举例来说[ls],系统会依照PATH的设定去每个PATH定义的目录下搜寻文件名为ls的可执行文件,如果在PATH定义的目录中含有多个文件名为ls的可执行文件,那么先搜寻到的同名指令先被执行! 2.使用echo $PATH可以查看那些目录被定义了.echo 有[显示.印出]的意思,而PATH 前面加上的 $ 表示后面接的是变量. 3.shell script 是利用shell 的功能所写的一个[程序program],这个程序是使用纯文本文件,将一些shell的语法与指令(

Linux学习资料-命令重导向

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