' 2>& 1'之间的差异和'&> filename'

时间:2015-04-03 03:40:57

标签: linux shell

我是Linux的初学者,我有一个关于重定向STDOUT和STDERR的问题。

  1. 创建file1以添加一些字符串

    echo hello > file1
    

    在此之后,当我做这样的事情时

    cat file1 file2
    

    会出现这样的错误

    hello
    cat: file2: No such file or directory
    
  2. 我想重定向STDOUT和STDERR,所以

    cat file1 file2 > file3 2>&1 | cat
    hello
    cat: file2: No such file or directory
    
  3. 我知道|可以使用last命令的输出作为输入,对吗? 所以第一个cat的输出是:

    hello
    cat: file2: No such file or directory
    
  4. 现在,我找到另一种重定向输出的方法,例如:

    cat file1 file2 &> file3
    cat file3
    hello
    cat: file2: No such file or directory
    
  5. 它可以做同样的事情,但当我添加|cat时,结果是

    cat file1 file2 &> file3 | cat
    hello
    

    STDERR在哪里?这意味着只有hello是第一个cat的输出?

  6. 2>&1&>file之间有什么区别?

2 个答案:

答案 0 :(得分:0)

  1. 输出hello出现在标准输出上。标准错误上显示错误消息。从此以后,那些将是stdout和stderr。

  2. 您声称cat file1 file2 > file3 2>&1 | cat在终端上产生了一些输出。它不适用于任何标准shell。当我运行它时,它不会产生可见的输出,但file3包含来自file1的行和错误消息。由于没有输入可供读取,因此第二个cat命令退出而不产生任何输出。

    > file3重定向将stdout发送到file32>&1将stderr发送到stdtout要去的同一个地方。文件描述符0是标准输入(stdin),1是标准输出,2是标准输入。

  3. 没有输出到管道;它全部发送到文件(但首先创建管道,然后将stdout重定向到文件)。

  4. 这些命令表明所有输出(stdout和stderr)都写入file3

  5. 您声称cat file1 file2 &> file3 | cat在终端上产生了一些输出。它与Bash没有关系;没有输出,因为stdout和stderr都转到file3

  6. &> 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& file2stdout,但file2不存在(它告诉你)。要设置file2,您可以cat file1 > file2cat 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。由于您已将stdinstdoutstderr重定向到cat file1 file2,因此管道后面的file3不会发送任何内容。您发布的输出似乎来自:

cat

在Linux shell中,cat file3 只是分别代表文件描述符stdin, stdout and stderr的特殊文件。文件系统中的实际文件是0, 1 & 2/dev/stdin/dev/stdout。如果使用/dev/stderr命令进行检查,您将看到文件和文件描述符之间的关系:

ls -l