Linux shell编程中IO和条件及循环处理的细节问题讨论

2019-09-23 09:20:25于丽

okay,又到讲古时间~~~当你搞懂了0<原来就是改变stdin的数据输入信道之后,相信要理解如下两个redirection就不难了:1> 2> 。前者是改变stdout的数据输出信道,后者是改变stderr的数据输出信道。两者都是将原本要送出到monitor的数据转向输出到指定档案去。

由于1是>的预设值,因此,1>与>是相同的,都是改变stdout。用上次的ls例子来说明一下好了:

$ ls my.file no.such.file 1>file.out
ls: no.such.file: No such file or directory

这样monitor就只剩下stderr而已。因为stdout给写进file.out去了。

$ ls my.file no.such.file 2>file.err
my.file

这样monitor就只剩下stdout,因为stderr写进了file.err。

$ ls my.file no.such.file 1>file.out 2>file.err

这样monitor就啥也没有,因为stdout与stderr都给转到档案去了…

呵~~~看来要理解>一点也不难啦﹗是不?没骗你吧?^_^ 不过,有些地方还是要注意一下的。
首先,是同时写入的问题。比方如下这个例子:

$ ls my.file no.such.file 1>file.both 2>file.both

假如stdout(1)与stderr(2)都同时在写入file.both的话,则是采取“覆盖”方式:后来写入的覆盖前面的。让我们假设一个stdout与stderr同时写入file.out的情形好了:

首先stdout写入10个字元 然后stderr写入6个字元

那么,这时候原本stdout输出的10个字元就被stderr覆盖掉了。那,如何解决呢?所谓山不转路转、路不转人转嘛,我们可以换一个思维:将stderr导进stdout或将stdout导进sterr,而不是大家在抢同一份档案,不就行了﹗bingo﹗就是这样啦:

2>&1就是将stderr并进stdout作输出 1>&2或>&2就是将stdout并进stderr作输出

于是,前面的错误操作可以改为:

$ ls my.file no.such.file 1>file.both 2>&1


$ ls my.file no.such.file 2>file.both >&2

在Linux档案系统里,有个设备档位于/dev/null。许多人都问过我那是甚么玩意儿?我跟你说好了:那就是“空”啦﹗没错﹗空空如也的空就是null了….请问施主是否忽然有所顿误了呢?然则恭喜了~~~ ^_^ 这个null在I/O Redirection中可有用得很呢:

若将FD1跟FD2转到/dev/null去,就可将stdout与stderr弄不见掉。 若将FD0接到/dev/null来,那就是读进nothing。

比方说,当我们在执行一个程序时,画面会同时送出stdout跟stderr,

假如你不想看到stderr(也不想存到档案去),那可以:

$ ls my.file no.such.file 2>/dev/null
my.file

若要相反:只想看到stderr呢?还不简单﹗将stdout弄到null就行:

$ ls my.file no.such.file >/dev/null
ls: no.such.file: No such file or directory