我不太明白计算机如何读取这个命令。
cat file1 file2 1> file.txt 2>&1
如果我理解,2>&1
只需将标准错误重定向到标准输出即可。
按照这个逻辑,该命令对我来说如下:
连接文件
file1
和file2
.stdout
从此操作发送到file.txt
.发给。
stderr
stdout
结尾?
我不确定计算机在做什么。按照我的逻辑,命令应该是
cat file1 file2 2>&1 > file.txt
但这是不正确的。
答案1
我发现使用作业更容易想到。
>
就好像=
&
就好像$
你开始于
1 = /dev/tty
2 = /dev/tty
那么你的第一个例子1> file.txt 2>&1
,
1 = file.txt
2 = $1 # and currently $1 = file.txt
留给你
1 = file.txt
2 = file.txt
如果你用另一种方式做,你再次开始
1 = /dev/tty
2 = /dev/tty
那么2>&1 > file.txt
2 = $1 # and currently $1 = /dev/tty
1 = file.txt
所以最终结果是
1 = file.txt
2 = /dev/tty
并且您只重定向了stdout
,而不是stderr
。
答案2
重定向的顺序很重要,应该阅读它们左到右。
例如:
command 2>&1 >somefile
意思是:
2
将名为(绑定到stderr
)的描述符重定向到当前的1
( )的目的地stdout
,此时从左到右读就是终端。- 然后将
1
(stdout
) 更改为somefile
,这是磁盘中的一个文件
因此,在这种情况下,stderr
转到终端,然后stdout
转到文件,这可能不是您想要的。
另一方面,command >somefile 2>&1
意味着:
- 重定向
stdout
至somefile
- 然后重定向到与( )
stderr
相同的目的地。stdout
somefile
在最后一种情况下,stderr
和stdout
go to somefile
,这可能就是您想要的。
答案3
cat file1 file2 1> file.txt 2>&1
>&
实际上意味着重复,它使用 dup 系统调用将新的文件描述符映射到已打开的文件上。
因此,您(实际上是 bash)必须先打开新的标准输出,然后说“并将标准错误重定向到当前设置的任何标准输出”。
答案4
该命令将命令的和cat file1 file2 > file.txt 2>&1
发送到。现在,这仅在未找到 file1 或 file2 的情况下才有用,在这种情况下,显示“文件未找到”的错误消息将保存到 file.txt。stdout
stderr
cat
file.txt
这与 相同cat file1 file2 &> file.txt
。
现在重定向的顺序很重要。以下不会将 cat 命令的 stderr 发送到 file.txt 而是发送到终端。
$ cat file1 file2 2>&1 > file.txt
这是因为它首先将 stdout 的目的地复制到 stderr,但此阶段的 stdout 仍然指向终端。然后,您将 stdout 重定向到 file.txt,因此只有 stdout 会保存到 file.txt。错误消息仍会打印到屏幕上,并且不会保存到 file.txt 中。