1.預備知識
標準輸入(stdin)、標準輸出(stdout)和標準錯誤(stderr)是編寫指令碼的時候經常使用的,因為輸出的資訊可能是上述的一種。
檔案描述符 是與開啟的某個檔案或者資料流相關聯的整數。檔案描述符0,1,2是系統預留的。
2.例項
echo this is a sample. > temp.txt
可將文字輸出到temp.txt
中,是通過截斷檔案的方式,也就是說在echo命令寫入前先將檔案中的內容清空。
echo this is a sample. >> temp.txt
上述命令是追加的方式。
說明重定向之前先了解一下什麼是成功和不成功的命令。
當乙個命令發生錯誤並退出的時候,它會返回乙個非0的值。成功後會返回0。可以通過$?
檢視返回的值。
ls
2> out.txt
將錯誤輸出到檔案中。
你也可以這樣:
cmd
2> out.txt 1> temp.txt
將標準錯誤和標準輸出重定向到兩個檔案中。當然,還有更精簡的方式輸出到同乙個檔案中:
cmd
2>&1 out.txt
有時候你並不想儲存錯誤輸出,那就將它引向乙個「黑洞」(/dev/null
)吧,就像錯誤輸出沒有產生過一樣。
這個時候,如果你既想把輸出儲存起來,同時又想檢視輸出,怎麼辦呢?
command | tee out.txt | cat -n
這個時候command 的結果會儲存在out.txt
中,同時也會通過管道最為標準輸出向下傳遞。cat -n
將結果加上行號輸出。
我們也可以使用stdin
作為命令引數。只需要將-作為命令的檔名即可。
$ echo who is
this | tee -
who is
this
eho is
this
3.原理
預設的重定向操作符使用標準輸出。因此>
等同於1>
。
4.補充
從stdin
讀取輸入的命令能以多種方式接受資料。
將檔案重定向到命令,借助重定向,我們可以像使用stdin
那樣從檔案中讀取資料。
$ cmd < file
自定義檔案描述符:
建立乙個檔案描述符進行檔案讀取:
$ exec
3# 使用檔案描述符3開啟並讀取檔案
我們可以這樣使用它:
$ echo this
is a test > input.txt
$ exec 3
這就可以在命令中使用檔案描述符3了。
$ cat <&3
this
is a test
如果想再次讀取就不能使用3了,需要再次分配讀取。
建立檔案描述符用於寫入:
$ exec 4>output.txt
$ echo newline > &4
$ cat outline
newline
dev/stdin -> proc/self/fd/0 -> dev/pts/1
標準操作下的輸入輸出,指向了虛擬目錄下當前程序的終端中。
重定向
$ tail -f /var/log/message > abc
然後掛起。ps
檢視一下該程序的程序號是15551
.
$ cat /proc/15551/fd/?
可以看到:
/proc/15551/fd/0
-> /dev/pts/1
/proc/15551/fd/1
-> /roor/test/abc #上述命令的重定向輸出檔案
/proc/15551/fd/2
-> /dev/pts/1
/proc/15551/fd/3
-> /var/log/message
/proc/15551/fd/4
-> inotify
重定向就是將鏈結指向執行的檔案。
管道將前面命令的標準輸出作為後面命令的標準輸入。
注意是標準輸出
也就是說,在管道傳遞的時候標準錯誤輸出已經被過濾掉了。所以,前面命令的標準錯誤輸出都會列印在終端上.
有很多命令不直接支援標準輸入的形式作為輸入。
$ which find | ls -l
不能輸出find
的資訊。使用如下的方式即可。
$ which find | xargs ls -l
linux 檔案描述符和重定向
檔案描述符系統自帶了3個,分別是 0 輸入 1 輸出,預設,省略 2 錯誤輸出重定向一般是 或者 bin bash ls 列印在console,內容如下 root localhost ccc test.sh ls 111.txt 這條命令的結果並沒有列印到控制台上,而是儲存到111.txt裡 ls ...
Linux 檔案描述符,檔案重定向
檔案重定向 先來說說檔案 當我們開啟乙個檔案時,作業系統為了管理該檔案,會建立乙個資料結構來描述它,記錄他的各種資訊,這個資料結構就是file結構體,乙個file結構體就表示了乙個已經開啟的檔案。程序中使用open函式開啟某個檔案,前提是需要我們將程序與檔案聯絡起來。所以程序pcb中就有乙個 fil...
玩轉Linux檔案描述符和重定向
原文出處 linux下的檔案描述符是與檔案輸入 輸出相關聯的整數。它們用來跟蹤已開啟的檔案。最常見的檔案描述符是stdin stdout和stderr.我們可以將某個檔案描述符的內容重定向到另乙個檔案描述符中。下面給出一些對檔案描述符進行操作和重定向的例子。1.5.1 預備知識 我們在編寫指令碼時會...