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

linuxexec和文件描述符妙用技巧

最近在看《精通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>hello.txt # 將輸出重定向到文件hello.txt,從此以後,這個腳本中的輸出都將被寫入文件hello.txt

echo "hello exec"

echo "hello world"

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

Copyright © Linux教程網 All Rights Reserved