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

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

那接下来,假如单纯只跑程序,不想看到任何输出结果呢?哦,这里留了一手上次节目没讲的法子,专门赠予有缘人﹗…^_^ 除了用>/dev/null 2>&1之外,你还可以如此:

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

(提示:将&>换成>&也行啦~~!)

okay?讲完佛,接下来,再让我们看看如下情况:

$ echo "1" > file.out
$ cat file.out
1
$ echo "2" > file.out
$ cat file.out
2

看来,我们在重导stdout或stderr进一份档案时,似乎永远只获得最后一次导入的结果。那,之前的内容呢?呵~~~要解决这个问提很简单啦,将>换成>>就好:

$ echo "3" >> file.out
$ cat file.out
2
3

如此一来,被重导的目标档案之内容并不会失去,而新的内容则一直增加在最后面去。easy?呵…^_^

但,只要你再一次用回单一的>来重导的话,那么,旧的内容还是会被“洗”掉的﹗这时,你要如何避免呢?----备份﹗yes,我听到了﹗不过….还有更好的吗?既然与施主这么有缘份,老纳就送你一个锦囊妙法吧:

$ set -o noclobber
$ echo "4" > file.out
-bash: file: cannot overwrite existing file

那,要如何取消这个“限制”呢?哦,将set -o换成set +o就行:

$ set +o noclobber
$ echo "5" > file.out
$ cat file.out
5

再问:那…有办法不取消而又“临时”盖写目标档案吗?哦,佛曰:不可告也﹗啊~开玩笑的、开玩笑的啦~ ^_^唉,早就料到人心是不足的了﹗

$ set -o noclobber
$ echo "6" >| file.out
$ cat file.out
6

留意到没有:在>后面再加个“|”就好(注意:>与|之间不能有空白哦)… 呼…(深呼吸吐纳一下吧)~~~ ^_^再来还有一个难题要你去参透的呢:

$ echo "some text here" > file
$ cat < file
some text here
$ cat < file > file.bak
$ cat < file.bak
some text here
$ cat < file > file
$ cat < file

嗯?!注意到没有?!!----怎么最后那个cat命令看到的file竟是空的?﹗why?why?why?当当当~上课啰~ ^_^
前面提到:$ cat < file > file 之后原本有内容的档案结果却被洗掉了﹗要理解这一现像其实不难,这只是priority的问题而已:

在IO Redirection中,stdout与stderr的管道会先准备好,才会从stdin读进数据。也就是说,在上例中,> file会先将file清空,然后才读进< file,但这时候档案已经被清空了,因此就变成读不进任何数据了…哦~原来如此~~ ^_^

那…如下两例又如何呢?

$ cat <> file
$ cat < file >> file

嗯…同学们,这两个答案就当练习题啰,下节课之前请交作业﹗好了,I/O Redirection也快讲完了,sorry,因为我也只知道这么多而已啦~嘻 ^_^ 不过,还有一样东东是一定要讲的,各位观众(请自行配乐~!#@!$%):----就是pipe line也!