最近在看《精通unix shell腳本程式設計》時,看到exec<$1 exec 1>$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>&100 100>&- # 将标準輸出連接配接到100,這是之前儲存的标準輸出
# 将描述符100關了,一了百了,因為已經還原标準輸出了,留着它實在沒必要
echo "oh, my god!" # 從這句開始将顯示在終端上
執行個體四:輸入重定向
exec 100<&0
exec <hello.txt
read line1
echo $line1
read line2
echo $line2
exec 0<&100 100>&-
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
do
echo "$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 {} \;
http://blog.csdn.net/chaofanwei/article/details/19110739