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

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

  想象一下,如果我知道错误信息会发生,所以要将错误信息忽略掉而不显示或储存呢?
这个时候黑洞装置 /dev/null 就很重要了!这个 /dev/null
可以吃掉任何导向这个装置的信息喔!将上述的范例修订一下:

范例四:承范例三,将错误的数据丢弃,屏幕上显示正确的数据
[[email protected] ~]$ find /home -name .bashrc 2> /dev/null
/home/dmtsai/.bashrc <==只有 stdout 会显示到屏幕上, stderr 被丢弃了

  再想象一下,如果我要将正确与错误数据通通写入同一个文件去呢?这个时候就得要使用特殊的写法了!
我们同样用底下的案例来说明:

范例五:将命令的数据全部写入名为 list 的文件中
[[email protected] ~]$ find /home -name .bashrc > list 2> list <==错误
[[email protected] ~]$ find /home -name .bashrc > list 2>&1 <==正确
[[email protected] ~]$ find /home -name .bashrc &> list <==正确

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

  2)standard input
: < 与 <<

  了解了 stderr 与 stdout
后,那么那个 < 又是什么呀?呵呵!以最简单的说法来说, 那就是『将原本需要由键盘输入的数据,改由文件内容来取代』的意思。 我们先由底下的 cat
命令操作来了解一下什么叫做『键盘输入』吧!


范例六:利用 cat 命令来创建一个文件的简单流程
[[email protected] ~]# cat > catfile
testing
cat file test
<==这里按下 [ctrl]+d 来离开

[[email protected] ~]# cat catfile
testing
cat file test

  由于加入 > 在 cat 后,所以那个 catfile 会被主动的创建,而内容就是刚刚键盘上面输入的那两行数据了。
唔!那我能不能用纯文本文件取代键盘的输入,也就是说,用某个文件的内容来取代键盘的敲击呢? 可以的!如下所示:


范例七:用 stdin 取代键盘的输入以创建新文件的简单流程
[[email protected] ~]# cat > catfile < ~/.bashrc
[[email protected] ~]# ll catfile ~/.bashrc
-rw-r--r-- 1 root root 194 Sep 26 13:36 /root/.bashrc
-rw-r--r-- 1 root root 194 Feb 6 18:29 catfile
# 注意看,这两个文件的大小会一模一样!几乎像是使用 cp 来复制一般!

  这东西非常的有帮助!尤其是用在类似 mail 这种命令的使用上。
理解 < 之后,再来则是怪可怕一把的 << 这个连续两个小于的符号了。 他代表的是『结束的输入字符』的意思!举例来讲:『我要用
cat 直接将输入的信息输出到 catfile 中, 且当由键盘输入 eof 时,该次输入就结束』,那我可以这样做:


[[email protected] ~]# cat > catfile << "eof"
> This is a test.
> OK now stop
> eof <==输入这关键词,立刻就结束而不需要输入 [ctrl]+d

[[email protected] ~]# cat catfile
This is a test.
OK now stop <==只有这两行,不会存在关键词那一行!

  看到了吗?利用 << 右侧的控制字符,我们可以终止一次输入, 而不必输入 [crtl]+d
来结束哩!这对程序写作很有帮助喔!好了,那么为何要使用命令输出重导向呢?我们来说一说吧!

  • 屏幕输出的信息很重要,而且我们需要将他存下来的时候;

  • 背景运行中的程序,不希望他干扰屏幕正常的输出结果时;

  • 一些系统的例行命令 (例如写在 /etc/crontab 中的文件) 的运行结果,希望他可以存下来时;

  • 一些运行命令的可能已知错误信息时,想以『 2> /dev/null 』将他丢掉时;

  • 错误信息与正确信息需要分别输出时。

  当然还有很多的功能的,最简单的就是常常问到的:『为何我的 root 都会收到系统 crontab
寄来的错误信息呢』这个咚咚是常见的错误, 而如果我们已经知道这个错误信息是可以忽略的时候,嗯!『 2> errorfile
』这个功能就很重要了吧! 了解了吗?

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

时间: 2024-10-13 09:16:28

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

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

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

第十一章、认识与学习 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.命令运行过

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下tomcat shutdown后 java进程依旧存在 -- 阿里MetaQ篇

此篇文章描述的症状和上一篇文章一致(即执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访问了,但是ps -ef | grep java 后,发现tomcat对应的java进程未随web容器关闭而销毁,进而存在僵尸java进程),但是处理的过程不一致,所有又单开了一篇blog来写. 我在另外一个项目中使用到了阿里的MetaQ消息中间件,然后shutdown tomcat 发现java进程依旧存在,沿用上一篇文章的思路,我最开始以为是本地代码中scheduledExec