Linux系列8:command>file 2>&1 & 命令詳解

1 符號基本含義

  • /dev/null 表示空設備文件,將輸出重定向到這個位置即表示丟棄
  • 0 表示stdin標準輸入
  • 1 表示stdout標準輸出
  • 2 表示stderr標準錯誤
  • &:命令最後的&表示將命令放到後臺執行

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

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

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

2 示例詳解

首選寫一個shell腳本:

#!/bin/sh

t       //t命令不存在,會產生標準錯誤輸出
date     //會產生標準輸出
  1. 執行腳本:未重定向的情況下標準錯誤輸出和標準輸出都顯示在終端顯示器
[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 ~]$
  1. 標準輸出重定向到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
3. 標準輸出不重定向,標準錯誤輸出重定向到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 ~]$
  1. 標準輸出重定向到testlog1,標準錯誤輸出重定向到testlog2
[vagrant@vmp2-local-dva01 ~]$ sh /var/www/pyxis2/system/fortest/test1.sh >testlog1 2>testlog2
# 等價於:sh /var/www/pyxis2/system/fortest/test1.sh 1>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 ~]$
  1. 標準輸出重定向到文件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 ~]$
  1. 標準錯誤輸出重定向到文件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 ~]$
  1. 標準輸出重定向到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 ~]$

3 command>file 2>file 與 command>file 2>&1的區別

  1. command>file 2>&1這條命令,等價於command 1>file 2>&1,可以理解爲執行command產生的標準輸入重定向到文件file中,標準錯誤也重定向到文件file中。
  2. 那麼是否就說command 1>a 2>&1等價於command 1>a 2>a呢。
  3. 其實不是,command 1>file 2>&1與command 1>file 2>file還是有區別的,區別就在於前者只打開一次文件file,後者會打開文件兩次,並導致stdout被stderr覆蓋,可能導致某些輸出錯誤。 ==&1的含義就可以理解爲用標準輸出的引用,引用的就是重定向標準輸出產生打開的file。==從IO效率上來講,command 1>file 2>&1比command 1>file 2>file的效率更高。

原文鏈接:linux command>file 2>&1 & 命令詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章