《LINUX教程:Linux教程之文件描述符、重定向、管道符、tee命令》要點:
本文介紹了LINUX教程:Linux教程之文件描述符、重定向、管道符、tee命令,希望對您有用。如果有疑問,可以聯系我們。
本節討論一下幾個問題:
1. 文件描述符.
2. 重定向.
3. 管道符
4. tee的用法.
在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?
?以上就是關于文件描述符.
?重定向包括:重定向輸出和重定向輸入:
?重定向輸出: ?
? ? 將命令的正常輸出結果保留到指定的文件中,而不是直接顯示在顯示器的屏幕上
? ? 重定向輸出使用”>” “>>” 操作符號
? ?> 覆蓋文件
? ?>> 追加內容
? 若重定向的輸出的文件不存在,則會新建該文件
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
?
? eg: 查看nginx的進程.
[root@xiaolyu ~]#?ps -aux | grep nginx?
? eg: 查看某個進程的端口:
功能:讀取標準輸入的數據,并將其內容輸出成文件.
語法: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? ? 追加
[root@xiaolyu ~]# ls -l yyy | tee -a who.out?
本文永久更新鏈接地址:
維易PHP培訓學院每天發布《LINUX教程:Linux教程之文件描述符、重定向、管道符、tee命令》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。