linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <

覆盖定向, >> 是 append 定向, 默认是 1> 或 1>> 标准定向.

1>&2 是标准转 err, 2>1& 是 err 转标准

常用命令

ls >> file.txt 2>&1 & 将所有内容输出到同一个问题

ls >> file.log 2>/dev/null & 将日志输出到文件, 错误丢弃.

重定向命令其实用得不少吧,只是重来都没有仔细看过,这波正好又用到 又有空总结一波。

> 和 >>

他们俩其实唯一的区别就是>是重定向到一个文件,>>是追加内容到文件。两个命令都是如果文件不存在则创建文件。举个例子来看看:

1
2
3
$ ll >> 123.txt
$ ll | grep 123.txt
-rw-r--r-- 1 ono staff 1.2K Mar 20 07:24 123.txt

可以看到可以将 ll 的输出 重定向到 123.txt 中, >也是同样的效果。只是如果使用>执行重定向的位置没有这个文件

1
2
3
4
5
6
$ ls > /nodir/123
zsh: no such file or directory: /nodir/123
$ ls >> /nodir/123
zsh: no such file or directory: /nodir/123
$ ls > 123
$ ls >> 1234

但是如果你重定向的是没有的文件夹里面的文件,那么文件夹他是不会帮你创建的,所以会报出错误,这点要注意。

1>、 2>、 1>>、 2>>

当我们需要把一个文件正确的输出,和错误的输出分开保存的时候就能用到他们啦。让我用一个简单的 node 脚本来做一个实验

1
2
3
// t.js
console.log("this is ok.");
throw new Error("this is error.");

该脚本会正确执打印 ‘this is ok.’ 然后 报出下面强转的错误.

1
2
3
4
5
$ node t.js 1> right.txt 2> wrong.txt
$ ls
right.txt t.js wrong.txt
$ cat right.txt
$ cat wrong.txt

可以看到,正确的输出被保存进了 right.txt 而错误的输出被重定向到了 wrong.txt

那么如果我们不区分 1>2>这样的重定向规则,运行结果会被保存成什么样子呢?

1
node t.js > out.txt

可以看到只保存了正确的结果,错误的信息被打印到标准输出上面。

那如果我们想让错误和正确的结果都被重定向到同一个文件又应该怎么做呢。

1
node t.js 1>out.txt 2>&1

可以看到,我们将错误也重定向到和 1 相同的文件 就实现了这个需求。

同理 1>> 2>>其实也就是追加数据到文件中,和前面介绍的> >>没有什么不同,需要提到的一点是,如果我们想将错误的和正确的信息重定向追加到同一个文件应该怎么做呢?你可能会想到 2>>&1。。。然而现实是,并没有这个语法。

然而我们却可以使用 1>>pp.txt 2>&1 的语法实现这个功能

1
node t.js 1>>out.txt 2>&1

可见看似 1> 1>> 2> 2>>是相一一对应的,但是其实不是,他们可以混用,比方说正确的结果想追加,错误的结果我想覆盖。

1
node t.js 1>>right.txt 2>wrong.txt

类似这种组合混用的情况,相对来说也不少见。也可以看出重定向标识的灵活性。

那么如果我们想保存正确的结果,错误的结果直接丢向垃圾站,既不保存为文件,也不在标准输出打印又该怎么做呢?

1
node t.js 1>>right.txt 2>/dev/null

直接将错误输出重定向到/dev/null 就好了,他就像一个无底洞,丢进去的东西就不见了。

< 和 <<

参考资料: http://blog.chinaunix.net/uid-298599-id-2443108.html

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.