shell

在 bash 命令执行的过程中,主要有三种输出入的状况,分别是:

1. 标准输入;代码为 0 ;或称为 stdin ;使用的方式为 <
2. 标准输出:代码为 1 ;或称为 stdout;使用的方式为 1>
3. 错误输出:代码为 2 ;或称为 stderr;使用的方式为 2>
注意了!那个 1> 与 2> 之间并没有空白字元!而相关的使用说明可以举例如下
 
[test @test test]# ls -al > list.txt <==将显示的结果输出到 list.txt 档案中,若该档案以存在则予以取代! [test @test test]# ls -al >> list.txt <==将显示的结果累加到 list.txt 档案中,该档案为累加的,旧资料保留! [test @test test]# ls -al 1> list.txt 2> list.err <==将显示的资料,正确的输出到 list.txt 错误的资料输出到 list.err [test @test test]# ls -al 1> list.txt 2>&1 <==将显示的资料,不论正确或错误均输出到 list.txt 当中! [test @test test]# ls -al 1> list.txt 2> /dev/null<==将显示的资料,正确的输出到 list.txt 错误的资料则予以丢弃!

注意!错误与正确档案输出到同一个档案中,则必须以上面的方法来写!不能写成其他格式。这个观念相当的重要,尤其是在 /etc/crontab 当中执行的时候,如果我们已经知道错误的讯息为何,又不想要让错误的讯息一直填满 root 的信箱,就必须以 2> 搭配 /dev/null 这个垃圾桶黑洞装置,来将资料丢弃!这个相当的重要!

这里我们来说明一下命令重导向里面几个常用的符号与装置:

< :由 < 的右边读入参数档案;
> :将原本由萤幕输出的正确资料输出到 > 右边的 file ( 档案名称 ) 或 device ( 装置,如 printer )去;
>> :将原本由萤幕输出的正确资料输出到 >> 右边,与 > 不同的是,该档案将不会被覆盖,而新的资料将以『增加的方式』增加到该档案的最后面;
     2> :将原本应该由萤幕输出的错误资料输出到 2> 的右边去。
/dev/null :可以说成是黑洞装置!

对于『 > , >> 』这两个东西有一定的概念之后,我们来深入的谈一谈『命令输出重导向』的观念吧!如前所述,基本上, Linux 执行的结果中,可以约略的分成『正确输出』与『错误输出』两种方式。例如,当你以一般身份执行 find 这个指令时,例如执行『 find / -name testing 』时,由于你是一般身份,又有些资料夹是不允许一般身份者进入的,所以啰,当你使用 find 时,就会有错误讯息发生了!但同时如果有 testing 这个档案在你可以进入的资料夹当中,那么萤幕也会输出到给你看!因此,就具有正确的与错误的输出两种啰!(分别称为 Stdout 与 Stderror)例如下面为执行结果:里面的『 find: /home/root: Permission denied 』就告诉你该资料夹你没有权限进入,这就是错误的输出了,那么『 /home/test/tseting 』就是正确的输出了!
 
[test @test test]# find / -name testing find: /home/test1: Permission denied <==这是错误的输出

find: /home/root: Permission denied  <==这是错误的输出

find: /home/masda: Permission denied <==这是错误的输出

/home/test/testing<==这是『正确』的输出 [test @test test]#
 

那么假如我们想要将资料输出到 list 这个档案中呢?执行『 find / -name testing > list 』会有什么结果?呵呵,你会发现 list 里面存了刚刚那个『正确』的输出资料,至于萤幕上还是会有错误的讯息出现呢!伤脑筋!如果想要将正确的与错误的资料分别存入不同的档案中需要怎么做?!呵呵!其实在资料的重导向方面,正确的写法应该是『 1> 』与『 2> 』才对!但是如果只有 > 则预设是以 1> 来进行资料的!那个 1> 是输出正确资料, 2> 则是错误资料输出项目。也就是说:

1> :是将正确的资料输出到指定的地方去 
2> :是将错误的资料输出到指定的地方去

那么上面的例子中,我们如何将资料输出到不同的地方去呢?可以这么写:
 
[test @test test]# find / -name testing 1> list_right 2> list_error

这样一来,刚刚执行的结果中,有 Permission 的那几行错误资讯都会跑到 list_error 这个档案中,至于正确的输出资料则会存到 list_right 这个档案中。如果我只要正确的资料,错误的资讯我不要了呢,这个时候 /dev/null 这个垃圾桶就很重要了!/dev/null 是什么呢?基本上,那就有点像是一个『黑洞』的垃圾桶功能!当你输入的任何东西导向到这个虚拟的垃圾桶装置时,『他就会凭空消失不见了~~』,这个东西有用的很!例如上面的例子中,我们可以这么做,来将错误的资讯丢掉!
 
[test @test test]# find / -name testing 1> list_right 2> /dev/null

error message 就会『不见了!』另外,如果我要将资料都写到同一个档案中呢?这个时候写法需要用到特殊写法,请注意底下的写法。
 
[test @test test]# find / -name testing 1> list 2> list <==错误写法

[test @test tset]# find / -name testing 1> list 2>&1 <==正确写法

请特别留意这一点呢!同时写入同一个档案需要使用 2>&1 才对!

了解了 >, 2>, >> 与 /dev/null 之后,那么那个 < 又是什么呀?以最简单的说法来说,那就是『将原本需要由键盘输入的资料,经由档案来读入』的意思,最明显的例子就是 mail 这个东西了!我们以 root 的身份来寄信给 root 好了,可以这样做:
 
1. 完全由键盘输入资料: [root @test test]# mail -s "test" root <== -s 表示标题, root 为收件者 I am root! <==以下的资料都是由键盘输入的 That's OK .   <==要结束键盘的输入时,需要在一行的最前面加上 . 即可! CC. <==是否需要有密件副本?不需要的话,直接按下 Enter ! EOF <==表示送出的提示字元而已! 2. 由档案代替输入 [test @test tset]# mail -s "test" root < /root/.bashrc <==将 .bashrc 内容寄给 root !
所以说,熟悉命令重导像的话,可是相当的有帮助的!那么为何要使用命令输出重导向呢?如果你从来都没有写过 script 的话!好了,我们来说一下:

当萤幕输出的资讯很重要,而且我们需要将他存下来的时候;
背景执行中的程式,不希望他干扰萤幕正常的输出结果时;
一些系统的例行命令(例如写在 /etc/crontab 中的档案)的执行结果,希望他可以存下来时;
一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时;
     错误讯息与正确讯息需要分别输出时。
 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值