當linux執行一個程序的時候,會自動打開三個流,標準輸入*(standard input),標準輸出(standard output),標準錯誤輸出(standard error)*,比如在打開命令行時,默認情況下,命令行的標準輸入連接到鍵盤,標準輸出和標準錯誤都連接到屏幕,儘管三個流都打開,但他會根據需要使用。
重定向
>
>
可以改變文本流的方向,指定輸出目的地。(覆蓋)
例子:
輸入命令
ls > aa.txt
解釋:
改變ls命令用來顯示內容的容器,默認容器是屏幕,現將容器改爲aa.txt
執行結果:
打開aa.txt可看到所有ls命令的顯示內容
「注意」:
-
若aa.txt是一個不存在文件,重定向時計算機會新建一個aa.txt文件,並將命令行的標準輸出指向這個文件。
-
若aa.txt是一個已存在文件,重定向時會覆蓋原aa.txt文件中的內容。
樣例:
-
echo ok > a.txt
解釋:echo的作用是將文本流導向標準輸出
執行結果:ok寫入a.txt中
-
cat < a.txt
解釋:將cat標準輸入只想a.txt,文本會從文件流到cat,然後輸出到屏幕上
執行結果:同
cat a.txt
-
cat < a.txt > b.txt
解釋:a.txt中內容複製到了b.txt中
-
cat > a.txt < b.txt
解釋:b.txt中內容複製到了a.txt中
>&
&
表示等同於的意思
例子:
假設void是一個不存在的目錄,當我們執行
cd void > a.txt
屏幕出現錯誤提示
bash: cd: void: No such file or directory
當我們執行
cd void >& a.txt
錯誤信息被導向a.txt
樣例:
cd void 2 > a.txt > b.txt
解釋:標準錯誤對應的總是2,所有有以上寫法。標準錯誤輸出到a.txt,標準輸出輸出到b.txt
追加
>>
>>
可以改變文本流的方向,指定輸出目的地。(追加)
例子:
cat a.txt >> b.txt
將cat a.txt命令的標準輸出指向b.txt文件
執行結果:
打開b.txt可看到a.txt的內容被添加到原b.txt內容後面
「注意」:
-
若b.txt是一個不存在文件,重定向時計算機會新建一個b.txt文件,並將命令行的標準輸出指向這個文件。
-
若b.txt文件已存在,重定向時會追加到原b.txt中內容後面,不覆蓋。
樣例:
-
做輸入分隔符
分隔符可以是任意字符。
cat > a.txt << end
當執行cat > a.txt << end,命令並沒有結束,cat命令在等待你給他輸入數據,當我們敲入end後,cat命令才結束。end之前輸入的字符都被寫到a.txt文件中,這就是輸入分隔符的作用。
高級用法
-
>/dev/null
這條命令的作用是將標準輸出1重定向到
/dev/null
中。/dev/null
代表linux的空設備文件,所有王這個文件裏寫入的內容都會丟失,俗稱“黑洞”。執行此命令後,標準輸出就會不再存在,沒有任何地方能找到輸出的內容。 -
2>&1
這條命令用到了重定向綁定,採用&可以將兩個輸出綁定在一起。這條命令的作用是錯誤輸出將和標準輸出同用一個文件描述符,也就是錯誤輸出會和標準輸出輸出到同一個地方。
-
>/dev/null 2>&1 VS 2>&1 >/dev/null
從左到右地來分析
2>&1 >/dev/null
:2>&1
,將錯誤輸出綁定到標準輸出上。由於此時的標準輸出是默認值,也就是輸出到屏幕,所以錯誤輸出會輸出到屏幕。
>/dev/null
,將標準輸出1重定向到/dev/null
中。我們用一個表格來更好地說明這兩條命令的區別:
命令 標準輸出 錯誤輸出 >/dev/null 2>&1 丟棄 丟棄 2>&1 > /dev/null 丟棄 屏幕