> 與 < 差在哪?
谈到I/O redirection,不妨先让我们认识一下File Descriptor(FD)。程序的运算,在大部份情况下都是进行数据(data)的处理,这些数据从哪读进?又,送出到哪里呢?这就是File descriptor(FD)的功用了。
在shell程序中,最常使用的FD大概有三个,分别为:
0: Standard Input(STDIN) 1: Standard Output(STDOUT) 2: Standard Error Output(STDERR)在标准情况下,这些FD分别跟如下设备(device)关联:
stdin(0):keyboard stdout(1):monitor stderr(2):monitor我们可以用如下下命令测试一下:
$ mail -s test rootthis is a test mail.please skip.
^d(同时按crtl跟d键)
很明显,mail程序所读进的数据,就是从stdin也就是keyboard读进的。不过,不见得每个程序的stdin都跟mail一样从keyboard读进,因为程序作者可以从档案参数读进stdin,如:
$ cat /etc/passwd
但,要是cat之后没有档案参数则又如何呢?哦,请您自己玩玩看啰….^_^
$ cat
(请留意数据输出到哪里去了,最后别忘了按^d离开…)至于stdout与stderr,嗯…然后,让我们继续看stderr好了。
事实上,stderr没甚么难理解的:说穿了就是“错误信息”要往哪边送而已…比方说,若读进的档案参数是不存在的,那我们在monitor上就看到了:
$ ls no.such.filels: no.such.file: No such file or directory
若,一个命令同时产生stdout与stderr呢?那还不简单,都送到monitor来就好了:
$ touch my.file$ ls my.file no.such.filels: no.such.file: No such file or directorymy.file
okay,至此,关于FD及其名称、还有相关联的设备,相信你已经没问题了吧?那好,接下来让我们看看如何改变这些FD的预设数据信道,我们可用<来改变读进的数据信道(stdin),使之从指定的档案读进。我们可用>来改变送出的数据信道(stdout,stderr),使之输出到指定的档案。比方说:
$ cat < my.file
就是从my.file读进数据
$ mail -s test root < /etc/passwd
则是从/etc/passwd读进…
这样一来,stdin将不再是从keyboard读进,而是从档案读进了…严格来说,<符号之前需要指定一个FD的(之间不能有空白),但因为0是<的预设值,因此<与0<是一样的!okay,这个好理解吧?
那,要是用两个<<又是啥呢?这是所谓的HERE Document,它可以让我们输入一段文本,直到读到<<后指定的字串。比方说:
$ cat <<FINISHfirst line heresecond line therethird line nowhereFINISH
这样的话,cat会读进3行句子,而无需从keyboard读进数据且要等^d结束输入。
新闻热点
疑难解答