<与>的用法

来源:互联网 发布:惠普工作站笔记本 知乎 编辑:程序博客网 时间:2024/05/16 18:07

在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 参数达成。


原创粉丝点击