我是Linux的初学者,我有一个关于重定向STDOUT和STDERR的问题。
创建file1
以添加一些字符串
echo hello > file1
在此之后,当我做这样的事情时
cat file1 file2
会出现这样的错误
hello
cat: file2: No such file or directory
我想重定向STDOUT和STDERR,所以
cat file1 file2 > file3 2>&1 | cat
hello
cat: file2: No such file or directory
我知道|
可以使用last命令的输出作为输入,对吗?
所以第一个cat
的输出是:
hello
cat: file2: No such file or directory
现在,我找到另一种重定向输出的方法,例如:
cat file1 file2 &> file3
cat file3
hello
cat: file2: No such file or directory
它可以做同样的事情,但当我添加|cat
时,结果是
cat file1 file2 &> file3 | cat
hello
STDERR在哪里?这意味着只有hello
是第一个cat
的输出?
2>&1
和&>file
之间有什么区别?
答案 0 :(得分:0)
输出hello
出现在标准输出上。标准错误上显示错误消息。从此以后,那些将是stdout和stderr。
您声称cat file1 file2 > file3 2>&1 | cat
在终端上产生了一些输出。它不适用于任何标准shell。当我运行它时,它不会产生可见的输出,但file3
包含来自file1
的行和错误消息。由于没有输入可供读取,因此第二个cat
命令退出而不产生任何输出。
> file3
重定向将stdout发送到file3
。 2>&1
将stderr发送到stdtout要去的同一个地方。文件描述符0是标准输入(stdin),1是标准输出,2是标准输入。
没有输出到管道;它全部发送到文件(但首先创建管道,然后将stdout重定向到文件)。
这些命令表明所有输出(stdout和stderr)都写入file3
。
您声称cat file1 file2 &> file3 | cat
在终端上产生了一些输出。它与Bash没有关系;没有输出,因为stdout和stderr都转到file3
。
&> file3
和> file3 2>&1
之间的差异是可移植性(&>
表示法的可移植性较差)和字符数;在功能上,它们是等同的。
答案 1 :(得分:0)
cat file1 file2
会出现这样的错误
hello cat: file2: No such file or directory
错误只是告诉您 file2
不存在。您可以使用重定向创建file1
:
echo hello > file1
现在file1
存在。当您执行cat file1 file2
时,cat
会尝试输出file1
& file2
到stdout
,但file2
不存在(它告诉你)。要设置file2
,您可以cat file1 > file2
将cat file1
的输出重定向到file2
,或者只需cp file1 file2
。然后file2
将存在。
我想重定向STDOUT和STDERR,所以
cat file1 file2 > file3 2>&1 | cat hello cat: file2: No such file or directory
同样,file2
仍然不存在。 cat
的{{1}}缩写仅将输出的文件内容输出到concatenate
,除非重定向。 stdout
包含file1
,因此会随错误一起输出。 hello
被重定向到hello
,...和...,因为您已将file3
重定向到stderr
(例如stdout
),错误消息也是最终在2>&1
Linux shell中的file3
(管道)命令只从左侧的命令中获取|
,并在管道后将其重定向到命令的stdout
。由于您已将stdin
和stdout
从stderr
重定向到cat file1 file2
,因此管道后面的file3
不会发送任何内容。您发布的输出似乎来自:
cat
在Linux shell中,cat file3
只是分别代表文件描述符stdin, stdout and stderr
的特殊文件。文件系统中的实际文件是0, 1 & 2
,/dev/stdin
和/dev/stdout
。如果使用/dev/stderr
命令进行检查,您将看到文件和文件描述符之间的关系:
ls -l