首頁 > 軟體

Linux教學之檔案描述符、重定向、管道符、tee命令

2020-06-16 17:11:10

本節討論一下幾個問題:

1. 檔案描述符。

2. 重定向。

3. 管道符

4. tee的用法。

1. 檔案描述符。

在Linux系統中一切皆檔案。資料夾和裝置都是檔案。如何用來區別不同的檔案呢?這裡的區別不是我們在Windows下看到的字尾名不同來區別。也不是我們在Linux下用ls 命令看到的不同檔案的列表。這裡的檔案描述符主要討論的是對檔案操作的一個識別符號。無操作就無識別符號。   比如兩個進程同時在對同一個檔案進行讀操作。

如何區分這兩個讀操作呢?這就需要檔案檔案描述符來區別了。每一次開啟一個檔案就形成了一個檔案描述符,後開啟的描述符一般都要比先開啟的檔案描述符大。

比如:我們可以man 一下 open函數。 看一下返回值:

  [root@xiaolyu ~]# man open

也就是說檔案描述符是一個整數。當然了,系統預設最大是1024. 我們不妨用ulimit -n 來檢視一下。

我們也可以檢視一下:man socket 一下 看一下效果:

 也就是說檔案描述符可以通過多種途徑來生成。記住:只要對檔案進行操作,就會返回檔案描述符。

然後我們來看看系統自帶的3個檔案描述符。

這三個是最小的檔案描述符,我們自己操作檔案,返回的檔案描述符最小都是從4開始的。

stdin   標準輸入  預設的裝置是鍵盤    檔案描述符為:0 

命令將從標準輸入檔案中  讀取  在執行過程中的 需要的  輸入資料.  -->資料來源於檔案

stdout 標準輸出  預設的裝置是 顯示器  檔案描述符為:1

命令執行後的輸出結果,傳送到標準輸出檔案.  -->結果輸出到檔案

stderr 標準錯誤   預設的裝置是顯示器  檔案描述符為:2

 命令將執行期間的各種錯誤資訊傳送到標準錯誤檔案 -->錯誤資訊傳送到檔案

標準輸入,標準輸出和標準錯誤預設使用鍵盤和顯示器作為關聯裝置與作業系統進行互動完成最基本的輸入,輸出操作.

我們不妨用man stdin 來看一下:[root@xiaolyu ~]# man stdin 

 以上便是關於檔案描述符。

2. 重定向.

 重定向包含:重定向輸出和重定向輸入:

 重定向輸出:  

    將命令的正常輸出結果儲存到指定的檔案中,而不是直接顯示在顯示器的螢幕上

    重定向輸出使用”>” “>>” 操作符號

   >  覆蓋檔案

   >> 追加內容

  若重定向的輸出的檔案不存在,則會新建該檔案

eg:  檢視當前主機的CPU的型別儲存到kernel.txt檔案中(而不是直接顯示到螢幕上)

    uname -p 檢視cpu型別資訊 

   

 將核心 的版本資訊 和作業系統資訊 追加到kernel.txt

   

   重定向輸出就將結果輸出到檔案中(覆蓋和追加兩種方式)

 

重定向輸入 

   將命令中接收輸入的途徑由預設的鍵盤改為其他檔案.而不是等待從鍵盤輸入

   從檔案讀取資料

   操作符: “<”

   通過重定向輸入可以使一些互動式操作過程能夠通過讀取檔案來完成

 

  eg:使用passwd 設定密碼時.每次都根據提示輸入密碼比較煩瑣

    改用重定向輸入將可以忽略互動式的過程.而自動完成密碼設定  (結合—stdin 選項來識別標準的輸入)

   使用非互動式的去執行設定密碼:

 

 

[root@xiaolyu ~]# touch passwd.txt
[root@xiaolyu ~]# vim passwd.txt
[root@xiaolyu ~]# useradd zhangsan
useradd: user 'zhangsan' already exists
[root@xiaolyu ~]# useradd lisi
[root@xiaolyu ~]# passwd --stdin lisi < passwd.txt

Changing password for user lisi.

passwd: all authentication tokens updated successfully.

  重定向輸入就是通過檔案中的內容作為輸入的資料

錯誤重定向:

   將命令執行過程中出現的錯誤資訊 (選項或引數錯誤) 儲存到指定的檔案,而不是直接顯示到顯示器

   錯誤資訊儲存到檔案

   操作符: 使用2>

   2指的是錯誤檔案的編號 (在使用標準的輸入和輸出省略了1 0 編號)

在實際應用中,錯誤重定向可以用來收集執行的錯誤資訊.為排錯提供依據;

 對於shell指令碼還可以將無關緊要的錯誤資訊重定向到空檔案/dev/null中 以保持指令碼輸出的簡潔

eg: 使用tar命令進行備份的時候出新的錯誤資訊儲存到err.log檔案中

 

 把/dev/null看作"黑洞". 它非常等價於一個只寫檔案. 所有寫入它的內容都會永遠丟失. 而嘗試從它那兒讀取內容則什麼也讀不到. 然而, /dev/null對命令列和指令碼都非常的有用.

 

 echo $?   表示最近一次操作是否成功 。 0 成功  非零不成功

 正確的寫到一個檔案,錯誤的在寫到一個檔案

[root@xiaolyu ~]#  ls /tmp/ /nginx  1> a.txt 2>b.txt

儲存到一張圖片比較清爽:

輸出到同一個檔案中:

[root@xiaolyu ~]#  ls   /tmp/  /nginx/  1>a.txt  2>&1 

 

 

或者以下這種寫法 ,重定向到檔案的1可以省略,因為預設就是1.

[root@xiaolyu ~]#  ls /tmp/ /nginx/ >a.txt 2>&1

 

&> 混合輸出

不分正確的還是錯誤的

[root@xiaolyu ~]# ls /opt/  /MySQL &> a.txt

 

 3. 管道符 

  這裡只提管道符,關於管道有專門建立管道的函數,以及有名管道和無名管道,以及管道之間的通訊,我放在IPC通訊中闡述。

管道符,可以把兩條命令連起來,前面一條命令的輸出當成後面一條命令的輸入。

  eg: 檢視nginx的進程。

[root@xiaolyu ~]# ps -aux | grep nginx 

  eg: 檢視某個進程的埠:

4. tree命令。

功能:讀取標准輸入的資料,並將其內容輸出成檔案。
語法:tee [-a][--help][--version][檔案...]
tee指令會從標準輸入裝置讀取資料,將其內容輸出到標準輸出裝置,同時儲存成檔案。
參  數:
 -a或  --append  追加
 --help  線上幫助。
 --version  顯示版本資訊

eg1

[root@xiaolyu ~]# who  檢視使用者登入資訊

root :0 2016-08-13 07:58 (:0)
root pts/0 2016-08-13 11:21 (:0)

[root@xiaolyu ~]# who | tee who.out

 將who的結果輸出到who.out檔案 ,同時在終端顯示:

 

eg2

[root@xiaolyu ~]# pwd | tee -a who.out    追加

 要注意的是:在使用管道線時,前一個命令的標準錯誤輸出不會被tee讀取。

[root@xiaolyu ~]# ls -l yyy | tee -a who.out 

把標準錯誤也被tee讀取
[root@xiaolyu ~]# ls -l yyy   2>&1 | tee -a who.out

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-06/145264.htm


IT145.com E-mail:sddin#qq.com