iDo*_*ter 53 command-line shell bash io-redirection file-descriptors
我不太明白计算机是如何读取这个命令的。
cat file1 file2 1> file.txt 2>&1
如果我理解,2>&1
只需将标准错误重定向到标准输出。
按照这种逻辑,该命令对我来说如下:
连接文件file1
和file2
.
stdout
从此操作发送到file.txt
.
发送stderr
到stdout
.
结尾?
我不确定电脑在做什么。按照我的逻辑,命令应该是
cat file1 file2 2>&1 > file.txt
但这不正确。
Mik*_*kel 74
我发现使用作业更容易想到。
>
就好像 =
&
就好像 $
你开始
1 = /dev/tty
2 = /dev/tty
Run Code Online (Sandbox Code Playgroud)
那么你的第一个例子,1> file.txt 2>&1
,不
1 = file.txt
2 = $1 # and currently $1 = file.txt
Run Code Online (Sandbox Code Playgroud)
离开你
1 = file.txt
2 = file.txt
Run Code Online (Sandbox Code Playgroud)
如果你以另一种方式这样做,你再次开始
1 = /dev/tty
2 = /dev/tty
Run Code Online (Sandbox Code Playgroud)
然后2>&1 > file.txt
做
2 = $1 # and currently $1 = /dev/tty
1 = file.txt
Run Code Online (Sandbox Code Playgroud)
所以最终结果是
1 = file.txt
2 = /dev/tty
Run Code Online (Sandbox Code Playgroud)
并且您只重定向了stdout
,而不是stderr
.
Ame*_*ina 24
重定向的顺序很重要,应该从左到右阅读。
例如:
command 2>&1 >somefile
表示:
2
(绑定到stderr
)到当前的目的地1
(stdout
),其在这一点上,读左-OT-右边是终端。1
( stdout
) 改为 go to somefile
,这是磁盘中的一个文件所以在这种情况下,stderr
转到终端,然后stdout
转到一个文件,这可能不是您想要的。
另一方面,command >somefile 2>&1
意味着:
stdout
到somefile
stderr
到与stdout
( somefile
)相同的目的地。在最后一种情况下,stderr
和 都stdout
转到somefile
,这可能是您想要的。
cat file1 file2 1> file.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
>&
实际上意味着重复,它使用 dup 系统调用将一个新的文件描述符映射到一个已经打开的文件上。
因此,您(实际上是 bash)必须先打开新的标准输出,然后说“并将标准错误重定向到当前设置的任何标准输出”。