2015-04-03 50 views
0

我是Linux初學者,我有一個關於重定向STDOUT和STDERR的問題。'2>&1'和'&>文件名'之間的區別

  1. 創建file1添加一些字符串

    echo hello > file1 
    

    在此之後,當我做這樣的事情

    cat file1 file2 
    

    它會給這樣的錯誤

    hello 
    cat: file2: No such file or directory 
    
  2. 我想要重定向輸出和錯誤,所以

    cat file1 file2 > file3 2>&1 | cat 
    hello 
    cat: file2: No such file or directory 
    
  3. 我知道|可以使用一個命令的輸出作爲輸入,對不對? 所以第一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的輸出?

2>&1&>file有什麼區別?

+4

您確定'cat file1 file2&> file3 |貓'產生輸出?它不應該。 – 2015-04-03 03:47:03

+0

兩者在語義上相同。 – 2015-04-03 04:16:23

回答

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將存在。

我想重定向輸出和錯誤,所以

cat file1 file2 > file3 2>&1 | cat 
hello 
cat: file2: No such file or directory 

再次,file2也根本不存在。 catconcatenate的簡稱僅輸出作爲輸入給出的文件的內容至stdout,除非重定向。 file1包含hello因此它與錯誤一起輸出。 hello被重定向到file3,......然後......,既然你重定向到stderrstdout(如2>&1),該錯誤消息也file3

中的Linux shell |(管)命令只是需要結束stdout,並將其重定向到管道後命令的stdin。由於您已將stdoutstderrcat file1 file2重定向到file3,因此沒有任何內容發送到管道後面的cat。您發佈的輸出似乎都來自:

cat file3 

在Linux外殼,stdin, stdout and stderr是代表文件描述符0, 1 & 2,分別只需特殊文件。文件系統中的實際文件是/dev/stdin,/dev/stdout/dev/stderr。如果使用ls -l命令進行檢查,您將看到文件和文件描述符之間的關係:

$ ls -l /dev/std* 
lrwxrwxrwx 1 root root 4 Apr 2 17:47 /dev/stderr -> fd/2 
lrwxrwxrwx 1 root root 4 Apr 2 17:47 /dev/stdin -> fd/0 
lrwxrwxrwx 1 root root 4 Apr 2 17:47 /dev/stdout -> fd/1 
0
  1. 輸出hello出現在標準輸出上。錯誤消息出現在標準錯誤上。從今以後,這些將會是stdout和stderr。

  2. 您聲稱cat file1 file2 > file3 2>&1 | cat在終端上產生一些輸出。它不具有任何標準外殼。當我運行它時,它不會產生可見的輸出,但file3包含從file1和錯誤消息的行。由於沒有輸入可供讀取,第二個cat命令將退出而不產生任何輸出。

    > file3重定向發送標準輸出到file32>&1將stderr發送到stdtout正在發送的相同位置。文件描述符0是標準輸入(標準輸入),1是標準輸出,2是標準錯誤。

  3. 沒有輸出發送到管道;它全部發送到文件(但管道是先創建的,然後stdout被重定向到文件)。

  4. 這些命令表明所有輸出(stdout和stderr)都被寫入file3

  5. 您聲稱cat file1 file2 &> file3 | cat在終端上產生一些輸出。它不與Bash;沒有輸出,因爲stdout和stderr都是file3

  6. &> file3> file3 2>&1之間的差異是可移植性(&>表示法不易攜帶)和字符數;在功能上,它們是等效的。