在shell进程中,最常用的FD(file descriptor)大概有三个,分别为:
0:Standard Input(STDIN)
1:Standard Output (STDOUT)
2:Standard Error Output (STDERR)
在标准情况下,这些FD分别跟如下设备(device)关联:
stdin(0):keyboard
stdout(1):monitor
stderr(2):monitor
可用 < 來改变读进的数据通道(stdin),使之从指定的档案读进。
可用 > 來改变送出的数据通道(stdout, stderr),使之输出到指定的档案。
严格来说, < 符号之前需要指定一个FD的(之间不能有空白),
因为0是 < 的预设值,因此 < 与 0< 是一样的。
<< 的用法:
这是所谓的 HERE Document,它可以让我们输入一段文本,直到读到 << 后指定的字串。
* 1> :改变stdout的数据输出通道
* 2> :改变stderr的数据输出通道
两者都是将原本要送出到monitor的数据转向输出到指定的档案去。
由于 1 是 > 的预设值,因此, 1> 与 > 是相同的,都是改变stdout。
* 2>&1 :就是将stderr并进stdout作输出
* 1>&2 或 >&2 :就是将stdout并进stderr作输出
在Linux文件系统里,有个设备档位于/dec/null。
这个null在I/O Redirection中的作用:
* 若将FD1 跟 FD2 转到 /dev/null 去,就可以将stdout 与 stderr 弄不见掉。
* 若将 FD0 接到 /dev/null 來,那就是读进 nothing。
&> 与 >& 的作用是将 stdout 与 stderr 输出到同一文件。
>> :追加到文件内容的后面。
set -o noclobber
设置使已存在的文件的内容不能覆盖,只能追加在文件内容的后面。 取消时使用 set +o noclobber
注:不取消set -o noclobber设置而又“临时“覆盖文件的内容:使用 “ >| ”(>与| 之间不能有空白)
例:
$ 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 > file 之后原本有内容的档案结果却被洗掉了!
这是priority(优先权)的问题:
* 在IO Redirection 中,stdout 与 stderr 的管道会先准备好,才会从stdin读进资料。
也就是说,在上例中, >file 会先将file 清空,然后才读进 <file,
这时文件file已经被清空了,因此就会变成读不进任何资料了。
pipe line “ | ”
* 上一个命令的stdout 接到下一个命令的stdin 去了!
* 在pipe line 之间,前一个命令的stderr 是不会接进下一个命令的stdin的,
其输出若不用2> 导到file 去的话,它还是送到监视器上面來!
tee命令:
* 所谓tee 命令是在不影响原本I/O的情况下,将stdout 复制一份到文件里去。
例:
cm1 | cm2 | tee file | cm3
在预设上,tee 会改写目标文件,若要改为增加内容的话,可用 -a 参数达成。