歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux --- 文件描述符和重定向

Linux --- 文件描述符和重定向

日期:2017/2/28 14:24:42   编辑:Linux教程

1.預備知識
標准輸入(stdin)、標准輸出(stdout)和標准錯誤(stderr)是編寫腳本的時候經常使用的,因為輸出的信息可能是上述的一種。

文件描述符 是與打開的某個文件或者數據流相關聯的整數。文件描述符0,1,2是系統預留的。

0 - stdin(標准輸入)
1 - stdout(標准輸出)
2 - stderr(標准錯誤)
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<input.txt # 使用文件描述符3打開並讀取文件
我們可以這樣使用它:

$ echo this is a test > input.txt
$ exec 3<input.txt
這就可以在命令中使用文件描述符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

標准操作下的輸入輸出,指向了虛擬目錄下當前進程的終端中。

1.2重定向&管道 原理:
重定向
$ 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

Copyright © Linux教程網 All Rights Reserved