對於 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 {} \;