一目了然版本:
&號含義: 參考
下面是我自己的一些總結.
在linux下,當乙個使用者程序被建立的時候,系統會自動為該程序建立三個資料流,也就是題目中所提到的這三個。那麼什麼是資料流呢(stream)?
我們知道,乙個程式要執行,需要有輸入、輸出,如果出錯,還要能表現出自身的錯誤。這是就要從某個地方讀入資料、將資料輸出到某個地方,這就夠成了資料流。
因此,乙個程序初期所擁有的這麼三個資料流,就分別是標準輸出、標準輸入和標準錯誤,分別用stdout, stdin, stderr來表示。對於這三個資料流來說,預設是表現在使用者終端上的.
linux啟動後,會預設開啟3個檔案描述符,分別是:標準輸入standard input 0,正確輸出standard output 1,錯誤輸出:error output 2
以後開啟檔案後。新增檔案繫結描述符可以依次增加。一條shell命令執行,都會繼承父程序的檔案描述符。因此,所有執行的shell命令,都會有預設3個檔案描述符。
先有乙個輸入:輸入可以從鍵盤,也可以從檔案得到
命令執行完成:成功了,會把成功結果輸出到螢幕:standard output預設是螢幕
命令執行有錯誤:會把錯誤也輸出到螢幕上面:standard error預設也是指的螢幕
檔案輸入輸出由追蹤為乙個給定的程序所有開啟檔案的整數控制代碼來完成。這些數字值就是檔案描述符。最為人們所知的檔案公尺描述符是 stdin, stdout 和 stderr,檔案描述符的數字分別是0,1和2。這些數字和各自的裝置是保留的。乙個命令執行前,先會準備好所有輸入輸出,預設分別繫結(stdin,stdout,stderr),如果這個時候出現錯誤,命令將終止,不會執行。命令解析過程,可以參考:linux shell 萬用字元、元字元、轉義符使用例項介紹
這些預設的輸出,輸入都是linux系統內定的,我們在使用過程中,有時候並不希望執行結果輸出到螢幕。我想輸出到檔案或其它裝置。這個時候我們就需要進行輸出重定向了。
1 [root@lanny ~]#view codell /dev/stdin
2 lrwxrwxrwx 1 root root 15 mar 20 20:48 /dev/stdin -> /proc/self/fd/0
3 [root@lanny ~]#
ll /proc/self/fd/0
4 lrwx------ 1 root root 64 mar 26 19:36 /proc/self/fd/0 -> /dev/pts/0
1. 標準輸入 (stdin) :**為 0 ,使用 < 或 < /proc/self/fd/0 0代表:/dev/stdin2. 標準輸出 (stdout):**為 1 ,使用 > 或 >> ; /dev/stdout -> /proc/self/fd/1 1代表:/dev/stdout
3. 標準錯誤輸出(stderr):**為 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr
#顯示當前目錄檔案 test.sh test1.sh test1.sh實際不存在
[maotai@n1 shell]$ ls test.sh test1.sh
ls: test1.sh: 沒有這個檔案和目錄
test.sh
#正確輸出與錯誤輸出都顯示在螢幕了,現在需要把正確輸出寫入suc.txt
# 1>可以省略,不寫,預設所至標準輸出
[maotai@n1 shell]$ ls test.sh test1.sh 1>suc.txt
ls: test1.sh: 沒有這個檔案和目錄
[maotai@n1 shell]$ cat suc.txt
test.sh
#把錯誤輸出,不輸出到螢幕,輸出到err.txt
[maotai@n1 shell]$ ls test.sh test1.sh 1>suc.txt 2>err.txt
[maotai@n1 shell]$ cat suc.txt err.txt
test.sh
ls: test1.sh: 沒有這個檔案和目錄
#繼續追加把輸出寫入suc.txt err.txt 「>>」追加操作符
[maotai@n1 shell]$ ls test.sh test1.sh 1>>suc.txt 2>>err.txt
#將錯誤輸出資訊關閉掉
[maotai@n1 shell]$ ls test.sh test1.sh 2>&-
test.sh
[maotai@n1 shell]$ ls test.sh test1.sh 2>/dev/null
test.sh
#&[n] 代表是已經存在的檔案描述符,&1 代表輸出 &2代表錯誤輸出 &-代表關閉與它繫結的描述符
#/dev/null 這個裝置,是linux 中黑洞裝置,什麼資訊只要輸出給這個裝置,都會給吃掉
#關閉所有輸出
[maotai@n1 shell]$ ls test.sh test1.sh 1>&- 2>&-
#關閉 1 ,2 檔案描述符
[maotai@n1 shell]$ ls test.sh test1.sh 2>/dev/null 1>/dev/null
#將1,2 輸出**給/dev/null裝置
[maotai@n1 shell]$ ls test.sh test1.sh >/dev/null 2>&1
#將錯誤輸出2 繫結給 正確輸出 1,然後將 正確輸出 傳送給 /dev/null裝置 這種常用
[maotai@n1 shell]$ ls test.sh test1.sh &>/dev/null
#& 代表標準輸出 ,錯誤輸出 將所有標準輸出與錯誤輸出 輸入到/dev/null檔案
&>/dev/null 等價於 >/dev/null 2>&1
Linux重定向(輸入輸出重定向)
我們知道,linux 中標準的輸入裝置預設指的是鍵盤,標準的輸出裝置預設指的是顯示器。而本節所要介紹的輸入 輸出重定向,完全可以從字面意思去理解,也就是 通常是用檔案或命令的執行結果來代替鍵盤作為新的輸入裝置,而新的輸出裝置通常指的就是檔案。對於輸入重定向來說,其需要用到的符號以及作用如表 1 所示...
linux輸入輸出重定向
基本概念 這是理解後面的知識的前提,請務必理解 a i o重定向通常與 fd有關,shell的fd通常為10個,即 0 9 b 常用fd有3個,為0 stdin,標準輸入 1 stdout,標準輸出 2 stderr,標準錯誤輸出 預設與keyboard monitor有關 c 用 來改變讀進的資料...
Linux輸入輸出重定向
標準輸入輸出 裝置 裝置檔名 檔案描述符 型別鍵盤 dev stdin 0標準輸入 顯示器 dev stdout 1標準輸出 顯示器 dev stderr 2標準錯誤輸出 輸出重定向 輸出重定向符號 1 標準輸出重定向 命令 檔案 以覆蓋方式把命令的正確輸出重定向到檔案或裝置 命令 檔案 以追加的方...