檔案描述符(0 1 2)的用法

2021-09-12 02:47:57 字數 1943 閱讀 1811

在 前面的[2] 尖括號教程中[3],你看到了如何使用>,如下:

ls > list.txt

將 ls 輸出傳遞給list.txt檔案。

現在我們看到的是簡寫:

ls 1> list.txt

在這種情況下,1是乙個檔案描述符,指向標準輸出(stdout)。

以類似的方式,2指向標準錯誤輸出(stderr):

ls 2> error.log

所有錯誤訊息都通過管道傳遞給error.log檔案。

回顧一下:1>是標準輸出(stdout),2>是標準錯誤輸出(stderr)。

第三個標準檔案描述符,0<是標準輸入(stdin)。你可以看到它是乙個輸入,因為箭頭(<)指向0,而對於12,箭頭(>)是指向外部的。

標準檔案描述符有什麼用?

例如,當(假如)你知道你的命令會丟擲乙個錯誤時,像stderr2)這樣的東西也很方便,但是 bash 告訴你的東西是沒有用的,你不需要看到它。如果要在home/目錄中建立目錄,例如:

mkdir newdir

如果newdir/已經存在,mkdir 將顯示錯誤。但你為什麼要關心這些呢?(好吧,在某些情況下你可能會關心,但並非總是如此。)在一天結束時,newdir會以某種方式讓你填入一些東西。你可以通過將錯誤訊息推入虛空(即 ``/dev/null`)來抑制錯誤訊息:

mkdir newdir 2> /dev/null

這不僅僅是 「讓我們不要看到醜陋和無關的錯誤訊息,因為它們很煩人」,因為在某些情況下,錯誤訊息可能會在其他地方引起一連串錯誤。比如說,你想找到/etc下所有的.service檔案。你可以這樣做:

find /etc -iname "*.service"

但事實證明,在大多數系統中,find 顯示的錯誤會有許多行,因為普通使用者對/etc下的某些資料夾沒有讀取訪問許可權。它使讀取正確的輸出變得很麻煩,如果 find 是更大的指令碼的一部分,它可能會導致行中的下乙個命令排隊。

相反,你可以這樣做:

find /etc -iname "*.service" 2> /dev/null

而且你只得到你想要的結果。

單獨的檔案描述符stdoutstderr還有一些注意事項。如果要將輸出儲存在檔案中,請執行以下操作:

find /etc -iname "*.service" 1> services.txt

工作正常,因為1>意味著 「傳送標準輸出且自身標準輸出(非標準錯誤)到某個地方」。

但這裡存在乙個問題:如果你想把命令丟擲的錯誤資訊記錄到檔案,而結果中沒有錯誤資訊你該怎麼做?上面的命令並不會這樣做,因為它只寫入 find 正確的結果,而:

find /etc -iname "*.service" 2> services.txt

只會寫入命令丟擲的錯誤資訊。

我們如何得到兩者?請嘗試以下命令:

find /etc -iname "*.service" &> services.txt

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

檔案描述符

檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...

檔案描述符

作業系統程序表中存放各個檔案進行檔案描述 核心 kernel 利用檔案描述符 file descriptor 來訪問檔案。檔案描述符是非負整數。開啟現存盤案或新建檔案時,核心會返回乙個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。目錄檔案描述符概述 如何建立檔案描述符 使用的好處 缺點...