最近在看《精通unix shell指令碼程式設計》時,看到exec$outfile,一下看的我就蒙了。網上看了大半天,終於搞定,記錄如下。
對於 linux 而言,所有對裝置和檔案的操作都使用檔案描述符來進行的。
檔案描述符是乙個非負的整數,它是乙個索引值,並指向核心中每個程序開啟檔案的記錄表。
當開啟乙個現存盤案或建立乙個新檔案時,核心就向程序返回乙個檔案描述符;當需要讀寫檔案時,也需要把檔案描述符作為引數傳遞給相應的函式。
通常,乙個程序啟動時,都會開啟 3 個檔案:標準輸入、標準輸出和標準出錯處理。這3 個檔案分別對應檔案描述符為 0、1和2也就是巨集替換 stdin_fileno、stdout_fileno和stderr_fileno。
檢視和設定linux檔案描述符數
ulimit -n
ulimit -n1024
例項一:通過exec分配檔案描述符
exec 3<>hello.txt # 以讀寫方式繫結到檔案描述符"3"
echo "hello exec" >&3 # 寫入"hello exec",如果之前有內容,這裡將會從檔案開頭進行覆蓋
echo "hello world" >&3 # 寫入"hello world「,新的一行!
exec 3>&- # 關閉寫,禁止寫,然而,實際上它也不能讀了~
# 如果是exec 3
在上面的示例中,將檔案hello.txt繫結到了描述符3。
例項二:將標準輸出重定向
exec 1>hello.txt # 將輸出重定向到檔案hello.txt,從此以後,這個指令碼中的輸出都將被寫入檔案hello.txt
echo "hello exec"
echo "hello world"
例項三:恢復重定向
exec 100>&1 # 將檔案描述符100連線到標準輸出
# 由於之後還要輸出到終端,所以我們不得不使用乙個臨時的描述符來儲存它!
exec 1>hello.txt # 將輸出重定向到檔案hello.txt,從此以後,這個指令碼中的輸出都將被寫入檔案hello.txt
echo "hello exec"
echo "hello world"
exec 1>&100 100>&- # 將標準輸出連線到100,這是之前儲存的標準輸出
# 將描述符100關了,一了百了,因為已經還原標準輸出了,留著它實在沒必要
echo "oh, my god!" # 從這句開始將顯示在終端上
例項四:輸入重定向
exec 100
exec
read line1
echo $line1
read line2
echo $line2
exec 0&-
read custom
例項五:讀寫檔案
#!/bin/bash
lang=c
echo "begin"
outfile="hello2.txt"
infile="hello.txt"
function file1
>$outfile #zero out the file ,相當於清空該檔案
exec 4>&1
exec 1> $outfile
while read line
doecho "$line"
done < $infile
exec 1>&4
exec 4>&-
file1
echo "end"
附 find 和exec妙用
(1)在當前目錄下(包含子目錄),查詢所有txt檔案並找出含有字串"bin"的行
find ./ -name "*.txt" -exec grep "bin" {} \;
(2)在當前目錄下(包含子目錄),刪除所有txt檔案
find ./ -name "*.txt" -exec rm {} \;
linux exec操作檔案描述符
linux每乙個開啟檔案都會關聯乙個檔案描述符,需要的時候我們可以使用exec命令指定乙個大於3的數字作為檔案 每開啟乙個shell就會開啟預設的三個檔案描述符描0,1,2,分別代表標準輸入,標準輸出和標準錯誤輸出。exec 5 tmp a.txt 讀方式 exec 5 tmp a.txt 讀寫方式...
控制代碼和檔案描述符
控制代碼是windows下的概念。控制代碼是windows下各種物件的識別符號,比如檔案 也許叫文件比較合適一點 資源 選單 游標 點陣圖等。檔案控制代碼和檔案描述符類似,它也是乙個非負整數,也用於定位檔案資料在記憶體中的位置。由於linux下所有東西都被看成是檔案,比如檔案 也許叫文件比較合適一點...
檔案流和 檔案描述符
include apue.h int glob 6 int main void else if pid 0 i printf pid d,glob d,var d n getpid glob,var sprintf buf,d n i write stdout fileno,buf,strlen b...