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的效率更高。
linux command>file 2>&1 & 命令詳解