linux command>file 2>&1 & 命令詳解


command>file 2>&1 &

命令的最后一個&表示把該命令以后台的job的形式運行

一個命令的執行伴隨着三種輸入輸出

標准輸入(stdin):默認指向鍵盤的輸入,可以通過標准輸入重定向<,讓標准輸入指向文件輸入

標准輸出(stdout) :指命令產生的正常的輸出,如echo aaa,標准輸出默認指向終端顯示器,可以通過輸出重定向>,讓標准輸出重定向到文件

標准錯誤輸出(stderr):指命令產生的錯誤信息的輸出,如執行了不存在的命令t,標准錯誤輸出也默認指向終端顯示器,同樣可以通過輸出重定向>,讓標准錯誤輸出重定向到文件

所謂的輸出重定向到文件,是指把默認輸出到終端顯示器的信息寫入到指定文件

標准輸入,標准輸出,標准錯誤輸出的文件描述符分別時0,1,2。

上面命令中

command 為要執行的命令

> 表示輸出重定向

file 表示要重定向的文件名

2和1 分別指標准錯誤輸出和標准輸出,

&1表示標准輸出的引用,所以2>&1是指把標准錯誤輸出重定向到標准輸出的引用,即也重定向到file

例子

腳本

#!/bin/sh

t       //t命令不存在,會產生標准錯誤輸出
date     //會產生標准輸出

執行腳本:未重定向的情況下標准錯誤輸出和標准輸出都顯示在終端顯示器

[vagrant@vmp2-local-dva01 ~]$ sh /var/www/pyxis2/system/fortest/test1.sh
/var/www/pyxis2/system/fortest/test1.sh: line 3: t: コマンドが見つかりません     //標准錯誤輸出顯示到顯示器
2019年  1月 18日 金曜日 18:43:37 JST                                           //標准輸出顯示到顯示器
[vagrant@vmp2-local-dva01 ~]$

 

標准輸出重定向到testlog文件,標准錯誤輸出不重定向

[vagrant@vmp2-local-dva01 ~]$ sh /var/www/pyxis2/system/fortest/test1.sh > testlog
/var/www/pyxis2/system/fortest/test1.sh: line 3: t: コマンドが見つかりません //標准錯誤輸出未重定向,錯誤信息默認顯示到顯示器 [vagrant@vmp2-local-dva01 ~]$ cat testlog //標准輸出重定向到testlog文件,所以標准輸出寫入到testlog文件,而沒有顯示到顯示器 2019年 1月 18日 金曜日 18:50:22 JST [vagrant@vmp2-local-dva01 ~]$

command >file   就相當於  command 1>file

標准輸出不重定向,標准錯誤輸出重定向到testlog

[vagrant@vmp2-local-dva01 ~]$ sh /var/www/pyxis2/system/fortest/test1.sh 2> testlog
2019年  1月 18日 金曜日 18:58:20 JST        //標准輸出未重定向,標准輸出默認輸出到顯示器
[vagrant@vmp2-local-dva01 ~]$ cat testlog   //標准錯誤輸出重定向到testlog文件,所以錯誤信息寫入到testlog文件,而沒有在顯示器顯示
/var/www/pyxis2/system/fortest/test1.sh: line 3: t: コマンドが見つかりません
[vagrant@vmp2-local-dva01 ~]$

 

標准輸出重定向到testlog1,標准錯誤輸出重定向到testlog2

[vagrant@vmp2-local-dva01 ~]$ sh /var/www/pyxis2/system/fortest/test1.sh >testlog1 2>testlog2
[vagrant@vmp2-local-dva01 ~]$ cat testlog1
2019年  1月 18日 金曜日 19:04:32 JST
[vagrant@vmp2-local-dva01 ~]$ cat testlog2
/var/www/pyxis2/system/fortest/test1.sh: line 3: t: コマンドが見つかりません
[vagrant@vmp2-local-dva01 ~]$

標准輸出重定向到文件testlog,標准錯誤輸出重定向到標准輸出的引用

[vagrant@vmp2-local-dva01 ~]$ sh /var/www/pyxis2/system/fortest/test1.sh >testlog 2>&1
[vagrant@vmp2-local-dva01 ~]$ cat testlog
/var/www/pyxis2/system/fortest/test1.sh: line 3: t: コマンドが見つかりません
2019年  1月 18日 金曜日 19:06:45 JST
[vagrant@vmp2-local-dva01 ~]$

標准錯誤輸出重定向到文件testlog,標准輸出和重定向到標准錯誤輸出的引用

[vagrant@vmp2-local-dva01 ~]$ sh /var/www/pyxis2/system/fortest/test1.sh 2>testlog 1>&2
[vagrant@vmp2-local-dva01 ~]$ cat testlog
/var/www/pyxis2/system/fortest/test1.sh: line 3: t: コマンドが見つかりません
2019年  1月 18日 金曜日 19:08:29 JST
[vagrant@vmp2-local-dva01 ~]$

標准輸出重定向到testlog文件,標准錯誤輸出也重定向到testlog文件

[vagrant@vmp2-local-dva01 ~]$ sh /var/www/pyxis2/system/fortest/test1.sh 1>testlog 2>testlog
[vagrant@vmp2-local-dva01 ~]$ cat testlog
2019年  1月 18日 金曜日 19:10:17 JST
ne 3: t: コマンドが見つかりません            //輸出不完全
[vagrant@vmp2-local-dva01 ~]$

 

command>a 2>a 與 command>a 2>&1的區別

對於command>a 2>&1這條命令,等價於command 1>a 2>&1

可以理解為執行command產生的標准輸入重定向到文件a中,標准錯誤也重定向到文件a中。

那么是否就說command 1>a 2>&1等價於command 1>a 2>a呢。

其實不是,command 1>a 2>&1與command 1>a 2>a還是有區別的,區別就在於前者只打開一次文件a,后者會打開文件兩次,並導致stdout被stderr覆蓋,可能導致某些輸出錯誤。

&1的含義就可以理解為用標准輸出的引用,引用的就是重定向標准輸出產生打開的a。從IO效率上來講,command 1>a 2>&1比command 1>a 2>a的效率更高。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM