`ls "*" 2>&1 | 怎么办? tee ls.txt` 工作?

how does `ls "*" 2>&1 | tee ls.txt` work?

我正在寻找一种将所有输出保存到文件并打印的方法。

像下面这样的命令确实可以完美运行!

ls "*" 2>&1 | tee ls.txt

但是我觉得我理解的不是很好

我试过了ls "*" | tee ls.txt。它不起作用。错误消息未保存到 ls.txt.

我也试过了ls "*" 1>&2 | tee ls.txt。它表现得有些奇怪。发生什么事了?

2>&1 表示 "redirect stderr (2) to wherever stdout (1) goes"。 12分别是stdoutstderr的文件描述符。

当您将 ls 输出通过管道传输到 tee 时,只有标准输出会转到 tee(没有 2>&1)。因此,错误消息不会保存到 ls.txt.

你实际可以使用:

ls "*" |& tee ls.txt

将 stdout 和 stderr 通过管道传输到 tee 命令。

ls '*' 实际上是在尝试列出名称为 * 的文件,因为 '*' 在引号内。

你的命令:

ls '*' 2>&1 | tee out

首先将 stderr(2) 重定向到 stdout(1),然后使用管道到 tee

l3x 所述,您正在将 "standard error: 2" 重定向到 "standard output: 1"。 解决方案是在实际错误发生之前触发重定向。所以不用

ls "*" 2>&1 | tee ls.txt

你应该使用

ls 2>&1 "*" | tee ls.txt

这样 "standard error" 就不会为空,并且会被重定向到 "standard output" 并且 T 恤会起作用,因为 "standard output" 不会为空。 我已经测试过它并且有效。 希望对您有所帮助