1. 程式人生 > >linux command>file 2>&1 & 命令詳解

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

code 是否 可能 例子 ech 區別 執行 class nbsp

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 & 命令詳解