本節討論一下幾個問題:
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
