- 论坛徽章:
- 1
|
关于>&2、2>&1等重定向的详细解释!
#./conj 2>;&1 >;a1
同样可以解释为2>;和1>;一样,但是这时1>;是系统默认输出到终端,所以标准错误也输出到终端;然后,系统把标准输出重定向到文件a1。
记得unixpianpianMM有个问题:
echo "Usage $0 -d" >;&2
那么可以解释为echo "Usage $0 -d" 1>;&2
也就是把结果输出到和标准错误一样;之前如果有定义标准错误重定向到某log文件,那么标准输出也重定向到这个log文件。
原帖由 "网中人" 发表:
$
ls my.file no.such.file 1>;file.both 2>;file.both
从 file system 的角度来说,单一档案在单一时间内,只能被单一的 FD 作写入。
假如 stdout(1) 与 stderr(2) 都同时在写入 file.both 的话,
则要看它们在写入时否碰到同时竞争的情形了,基本上是"先抢先赢"的原则。
让我们用周星驰式的"慢镜头"来看一下 stdout 与 stderr 同时写入 file.out 的情形好了:
* 第 1, 2, 3 秒为 stdout 写入
* 第 3, 4, 5 秒为 stderr 写入
那么,这时候 stderr 的第 3 秒所写的数据就丢失掉了﹗
要是我们能控制 stderr 必须等 stdout 写完再写,或倒过来,stdout 等 stderr 写完再写,那问题就能解决。
但从技术上,较难掌控的,尤其是 FD 在作"长期性"的写入时...
那,如何解决呢?所谓山不转路转、路不转人转嘛,
我们可以换一个思维:将 stderr 导进 stdout 或将 stdout 导进 sterr ,而不是大家在抢同一份档案,不就行了﹗
bingo﹗就是这样啦:
* 2>;&1 就是将 stderr 并进 stdout 作输出
* 1>;&2 或 >;&2 就是将 stdout 并进 stderr 作输出
于是,前面的错误操作可以改为:
$ ls my.file no.such.file 1>;file.both 2>;&1
或
$ ls my.file no.such.file 2>;file.both >;&2
这样,不就皆大欢喜了吗? 呵~~~ ^_^ |
|