標准輸出和標准錯誤輸出


相關概念

默認情況下,總是有三個文件處於打開狀態

1. 標准輸入(鍵盤輸入)			對應文件描述符0
2. 標准輸出(輸出到屏幕)		對應文件描述符1
3. 標准錯誤(也是輸出到屏幕)	對應文件描述符2

常用方法

>/dev/null 2>&1

實際上,應該等同於這樣:1 > /dev/null 2 > /dev/null ,默認情況下就是1,標准輸出,所以一般都省略。
而&號,后面接的是必須的文件描述符。
不能寫成2>1,這樣就成了標准錯誤重定向到文件名為1的文件中了,而不是重定向標准錯誤到標准輸出中。
所以這里就是:標准輸出重定向到了/dev/null,而標准錯誤又重定向到了標准輸出,
所以就成了標准輸出和標准錯誤都重定向到了/dev/null

2>&1 >/dev/null
事實上, 命令行的重定向什么的, 是在執行命令之前就准備好了的。
解釋順序從左至右依次進行, 2>&1 ,而1是屏幕, 所以標准錯誤重定向到屏幕, 
再而 1>/dev/null , 即標准輸出重定向到 /dev/null, 上述2>&1 >/dev/null
並不是什么同一時刻要么產生標准輸出要么產生標准錯誤. 而是兩個不同的東西.

用以下變量的方式做個解釋,就很明顯了,這兩種方式是不同的,前者就像:
a=1
b=a

而后者就像:
b=a
a=1

&>/dev/null
# 這個就是,不管你是啥玩意兒文件描述符,通通重定向到/dev/null

整理

&   一般是表示產生一個子shell,即后台運行
但在這里的&是一個標志,是個規定,這個符號后面的數字代表一個文件描述符
&1	這表示標准輸出
&2	標准錯誤輸出
2>&1	將標准錯誤重定向到標准輸出

實例

  • 實例講解
  1 #!/bin/bash
  2 
  3 date +%F > 1019
  4 date +% F 2> 1020

date +%F	的標准輸出是2017-10-19
date +% F	的標准輸出是空,只有標准錯誤輸出
	[root@localhost ~]# date +% F
	date: extra operand `F'
	Try `date --help' for more information.
1. 想要將錯誤輸出重定向到文件直接重定向是不行的
	date +% F > 1020
2. 若要做的的話需要這樣寫
	date +% F 2> 1020
3. 假設這樣寫
	date +% F >&2 1020	#開始我這樣寫的,但這是錯誤的
 #因為這個意思是將標准輸出重定向到標准輸出,
 #而此時的標准輸出為空,所以1020文件為空
  • 實例中發現的問題
	[root@localhost ~]# head 1 2
	==> 1 <==
	2222

	==> 2 <==
	1111
	[root@localhost ~]# awk '{print $0}' 1 2
	2222
	1111
	[root@localhost ~]# awk '{print $0}' 1 2>file
	2222
	[root@localhost ~]# awk '{print $0}' 1 2 >file
#這里就出現了一個有趣的現象,2后面的空格問題
#當2后面沒有空格時,shell就默認2>為一體,識別為標准錯誤輸出
#因為這里的文件名2與標准錯誤輸出的文件描述符沖突了

#當2后面有空格時,shell就識別2為文件名,作為awk的參數來處理

參考鏈接六神的CSDN


免責聲明!

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



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