天天看點

linux exec和檔案描述符妙用技巧(轉)

最近在看《精通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

繼續閱讀