Linux下使用exec命令將檔案與檔案描述符關聯

2021-08-20 22:45:40 字數 2515 閱讀 6298

在shell指令碼下exec為系統自帶的指令碼命令,其作用是用來執行其他程式:

語法格式:

exec (選項)(引數)
選項:

-c:在當前環境下執行命令,即在當前shell指令碼下執行,而不是開啟乙個新的shell
引數:

要執行的指令碼
示列:

exec -c echo linux
輸出:

linux
其效果與:

echo linux
是一樣的,並且exec還可以用來指定檔案描述符

首先要知道什麼是檔案描述符:

檔案描述符是乙個非負的整數,它是乙個索引值,並指向核心中每個程序開啟檔案的記錄表。

當開啟乙個現存盤案或建立乙個新檔案時,核心就向程序返回乙個檔案描述符;當需要讀寫檔案時,也需要把檔案描述符作為引數傳遞給相應的函式。

在linux下我們可以手動指定檔案描述符,無需讓系統為我們指定,這裡就要用到exec命令了:

exec 3<>hello.txt
這樣3這個數字就會被視為檔案描述符並與hello.txt檔案關聯,如果檔案不存在則建立!

並且在關聯之後3這個檔案描述符就會被開啟,我們可以對其進行讀或者寫:

//使用echo命令將"hello word"字元並使用重定向符號(<,>)重定向到檔案描述符3中

echo "hello word">&3 #如果檔案內容非空,則從頭開始覆蓋
注意如果持續寫入的話,即會換行寫入

比如:

echo "hello word">&3 #如果檔案內容非空,則從頭開始覆蓋
echo "hello word">&3 #如果檔案內容非空,則從頭開始覆蓋
echo "hello word">&3 #如果檔案內容非空,則從頭開始覆蓋
則內容為:

hello word
hello word
hello word
並且在當前shell當前執行緒下可以使用多個檔案描述符:

exec 1<>hello.txt

exec 2<>hello1.txt

//將hello1.txt裡的內容讀到hello.txt檔案裡

exec 1<&2
關閉讀寫:

exec 3>&- # 關閉寫,禁止寫,然而,實際上它也不能讀了~

# 如果是exec 3<&-,關閉讀,同時它也不能寫了~

&-相當於關閉此描述符

要知道linux下一切皆檔案,並且我們都知道標準i/o,這裡終端螢幕上的標準輸入輸出檔案描述符在linux下為100,這裡我們可以讓其重定向到檔案裡,這是linux已經建立了的檔案描述符,並且用於描述終端螢幕上的輸出i/o!

exec 1<>hello.txt

exec 100>&1

這樣我們就使用重定向描述符將當前shell指令碼,注意僅影響當前程序下的終端,linux會以對映的方式將程序之間的共用描述符區分開,這樣我們對它進行任何操作僅僅影響的是我們當前程序下的終端!

這樣我們使用:

echo dd
會發現終端上並沒有列印這行字,而是列印到hello.txt檔案裡去了!

注意,凡事任何會向輸出i/o裡輸入任何資料都會被重定向到hello.txt檔案裡去了!

如果想讓io恢復把它關閉即可恢復預設:

exec 100>&-
重定向輸入:

exec 1<>dd.txt

exec 100<&1

這樣我們使用cat命令將不再是將文字內容顯示出來,而是從鍵盤接受資料並寫入:

cat newfile
qqq

111

注意這裡要說明一下io檔案描述符,io只有乙個檔案,沒有輸入,輸出兩個檔案,讀即位輸出,寫即位輸入,具體怎樣重定向它還是看重定向描述符:《輸入,>輸出!

你會發現使用了此重定向,echo命令輸出的文字也被寫入到檔案裡去了,這裡沒有重定向輸出呀!

答:echo需要先將字元寫入到io檔案裡,然後在呼叫核心命令將io檔案裡的內容輸出到終端螢幕裡,此時輸入已經被重定向,所以echo輸出的字元不會被顯示而是被寫入到重定向的輸入檔案裡去了!

其實準確一點來說是沒有輸出的,因為輸出只是將檔案裡的內容讀取出來顯示到指定區域裡,所以c語言只定義了stdin輸入緩衝區描述符,輸入輸出只是對緩衝區的可讀性可寫性更直觀的表達而已!

對於輸出緩衝區就拿dos視窗來說可以指定的,詳細:輸出緩衝區介紹

linux下的exec命令

shell 中的 exec 兩種用法 1.exec 命令 命令代替shell程式,命令退出,shell 退出 比如 exec ls 2.exec 檔案重定向,可以將檔案的重定向就看為是shell程式的檔案重定向 比如 exec 5shell的內建命令exec將並不啟動新的shell,而是用要被執行命...

linux下c語言程式設計exec函式使用

exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。下面來看下exec函式族 include std.h int execl cons...

Linux下的exec函式

在程序間的程式替換 用fork建立子程序後執行的是和父程序相同的程式 但有可能執 行不同的 分 支 子程序往往要呼叫一種exec函式以執 行另 乙個程式。當程序呼叫一種exec函式時,該程序的使用者空間 和資料完全被新程式替換,從新程式的啟動例程開始執行。呼叫exec並後該程序的id並未改變。不建立...