相關概念
默認情況下,總是有三個文件處於打開狀態
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的參數來處理