歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

linux exec和文件描述符妙用技巧

對於 Linux 而言,所有對設備和文件的操作都使用文件描述符來進行的。
文件描述符是一個非負的整數,它是一個索引值,並指向內核中每個進程打開文件的記錄表。
當打開一個現存文件或創建一個新文件時,內核就向進程返回一個文件描述符;當需要讀寫文件時,也需要把文件描述符作為參數傳遞給相應的函數。

通常,一個進程啟動時,都會打開 3 個文件:標准輸入、標准輸出和標准出錯處理。這3 個文件分別對應文件描述符為0、1和2也就是宏替換 STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。

查看和設置LINUX文件描述符數


ulimit -n

ulimit -n 1024

 實例一:通過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關了,一了百了,因為已經還原標准輸出了,留著它實在沒必要</span>

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
{

<strong> </strong><strong> >$OUTFILE    #zero out the file ,相當於清空該文件
</strong>                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 {} \;

Copyright © Linux教程網 All Rights Reserved