linuxexec和檔案描述符妙用技巧

2021-12-29 22:36:26 字數 1936 閱讀 1101

最近在看《精通unix shell指令碼程式設計》時,看到exec$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

exec

read line1

echo $line1

read line2

echo $line2

exec 0&-

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

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

linux exec操作檔案描述符

linux每乙個開啟檔案都會關聯乙個檔案描述符,需要的時候我們可以使用exec命令指定乙個大於3的數字作為檔案 每開啟乙個shell就會開啟預設的三個檔案描述符描0,1,2,分別代表標準輸入,標準輸出和標準錯誤輸出。exec 5 tmp a.txt 讀方式 exec 5 tmp a.txt 讀寫方式...

控制代碼和檔案描述符

控制代碼是windows下的概念。控制代碼是windows下各種物件的識別符號,比如檔案 也許叫文件比較合適一點 資源 選單 游標 點陣圖等。檔案控制代碼和檔案描述符類似,它也是乙個非負整數,也用於定位檔案資料在記憶體中的位置。由於linux下所有東西都被看成是檔案,比如檔案 也許叫文件比較合適一點...

檔案流和 檔案描述符

include apue.h int glob 6 int main void else if pid 0 i printf pid d,glob d,var d n getpid glob,var sprintf buf,d n i write stdout fileno,buf,strlen b...