您的位置:首页 > 运维架构 > Shell

shell学习之< 和 > 差在哪?

2014-09-11 21:16 218 查看
严格来说,< 符号之前需要指定一个 FD 的(之间不能有空白),

但因为 0 是 < 的默认值,因此 < 与 0< 是一样的!

>   是定向输出到文件,如果文件不存在,就创建文件;如果文件存在,就将其清空;
一般我们备份清理日志文件的时候,就是这种方法:先备份日志,再用`>`,将日志文件清空
(文件大小变成0字节);

>>
这个是将输出内容追加到目标文件中。如果文件不存在,就创建文件;如果文件存在,
则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。


当你搞懂了 0< 原来就是改变 stdin 的数据输入信道之后,相信要理解如下两个 redirection

就不难了:

* 1>

* 2>

前者是改变 stdout 的数据输出信道,后者是改变 stderr 的数据输出信道。

两者都是将原本要送出到 monitor 的数据转向输出到指定档案去。

由于 1 是 > 的默认值,因此,1> 与 > 是相同的,都是改 stdout 。

从 file system 的角度来说,单一档案在单一时间内,只能被单一的 FD 作写入。

假如 stdout(1) 与 stderr(2) 都同时在写入 file.both 的话,

则要看它们在写入时否碰到同时竞争的情形了,基本上是"先抢先赢"的原则。

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

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

在 Linux 档案系统里,有个设备档位于 /dev/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 就行

为防止重定向将原有的文件内容“冲洗”掉,可以选择>> 追加到文件末尾。

但是一旦你再次用>重定向时,还是把所有内容冲掉了。

再此,你可以用以下命令设置是否允许重定向覆盖已有文件

set -o noclobber /*设置禁止重定向覆盖*/

set +o noclobber /*设置允许重定向覆盖*/

$ cat < file > file 之后原本有内容的档案结果却被洗掉了!

要理解这一现像其实不难,这只是 priority 的问题而已:

* 在 IO Redirection 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料。

也就是说,在上例中,> file 会先将 file 清空,然后才读进 < file ,

但这时候档案已经被清空了,因此就变成读不进任何资料了...

在 if 判断式中,else 部份可以不用,但 then 是必需的。

(若 then 后不想跑任何 command ,可用" : " 这个 null command 代替)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: