一、輸入和輸出1、標準檔案描述符
每個進程中最多可以有9個開啟檔案的描述符:0——stdin,1——stdout,2——stderr。
(1)STDIN
對於終端,stdin就是鍵盤。
使用輸入重新導向符號(<)時,就將使用重新導向引用的檔案替換標準的輸入檔案描述符。
(2)STDOUT
對於終端,stdout就是顯示器。
使用輸出重新導向符號(>)時,就將使用重新導向引用的檔案替換標準的輸出檔案描述符。
還可以使用>>,向檔案追加資料。
(3)STDERR
shell將錯誤提示資訊與正常輸出資訊分開處理。預設情況下,stderr與stdout都是輸出到顯示器。
2、重新導向錯誤
有幾種方法可以進行重新導向資料
(1)僅重新導向錯誤: 2> file (2必須位於>的正前方,2與>之間不能有空格),此時標準輸出不受影響,仍然輸出到顯示器
(2)重新導向錯誤和資料:
同時使用兩個重新導向輸出到不同檔案,2> file1, 1> file2。
輸出到同一個檔案:&> file
二、在指令碼中重新導向輸出
使用指令碼重新導向輸出的方法有以下兩種
1、臨時重新導向
重新導向到某個檔案描述符,必須在編號前加&號。ex: >&2 (>& 間無空格)
然後當這個檔案描述符對應的檔案被重新導向後,指令碼對應的重新導向輸出內容也同樣被重新導向。
2、永久重新導向
可以使用exec命令通知shell在指令碼執行期重新導向特定的檔案描述符
ex: exec 1>testout
重新導向stdout和stderr後,就無法輕鬆再重新導向回原來文字,需要提示(見下方)
三、在指令碼中重新導向輸入
同樣使用exec即可,ex: exec 0< file
對於讀取文本資料並使用指令碼處理,這是一個好方法。
四、建立自己的重新導向
除了0,1,2外,其他3-8都可以用於建立自己的重新導向。
1、建立輸出檔案描述符
同樣是先使用 exec 3>test13out,再將某一行 ……… >&3
2、重新導向檔案描述符
可以將stdout等的原位置重新導向到備選檔案描述符,然後將該檔案描述符重新導向回stdout。
ex: exec 3>&1
exec 1>file
……
exec 1>&3
這是一種臨時重新導向指令檔輸出然後恢複回普通設定的常用方法
3、建立輸入檔案描述符
使用上方同樣的方法,可將stdin先儲存,再定向,再恢複
ex: exec 6<&0
exec 0< testfile
…………
exec 0<&6
4、建立讀取/寫入檔案描述符
可以使用同一個檔案描述符從一個檔案讀取資料,同時向這個檔案寫入資料:
exec 3<> testfile
內部將維護一個檔案指標,指示內部的位置,讀取和輸入都將發生在指標上次所指的位置
5、關閉檔案描述符
使用&-進行關閉檔案描述符,ex :
exec 3>&- (之後就不可以再使用3了)
如果再開同一檔案,將覆蓋之前資料
五、列出開放檔案描述符
使用lsof命令可以列出整個系統上開放的檔案描述符。
可以使用$$確定當前PID,ex: lsof -a -p $$ -d 0,1,2
六、禁止命令輸出
將stderr重新導向到空檔案(/dev/null),則輸出的任何資料都不會儲存,即全部丟失。
使用 cat /dev/null > testfile 就可以快速將testfile中所有資料全部抹除。
七、使用臨時檔案
/tmp目錄專門用於儲存臨時檔案,每次開機時,/tmp下的檔案都將自動刪除。
可以使用mktemp命令,在/tmp下建立一個唯一的臨時檔案
1、建立本地臨時檔案
mktemp 檔案名稱.xxxxxx 就可以在本地目錄建立一個唯一的檔案
在指令碼中使用mktemp命令,需要使用一個變數儲存該檔案名稱。
2、在/temp中建立臨時檔案
使用mktemp -t就可以在/temp下建立臨時檔案,返回的是完整路徑名
3、建立臨時目錄
使用mktemp -d就可以在目前的目錄下建立臨時目錄
八、記錄訊息
同時將訊息發送到監視器和檔案,就可以使用tee命令。
ex: tee filename 將stdin的資料同時發送到stdout,和指定的檔案filename
可以與管道命令配置使用重新導向任何命令的輸出:ex: date | tee testfile
預設情況下,每次使用tee都將覆蓋輸出檔案,使用-a就可以向檔案添加資料