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的效率更高。
