久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Bash中的&符號和文件描述符如何理解

148次閱讀
沒有評論

共計 2657 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章將為大家詳細講解有關 Bash 中的&符號和文件描述符如何理解,文章內容質量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

在我們探究大多數鏈式 Bash 命令中出現的所有的雜項符號(、|、;、、、{、[、(、)、]、} 等等)的任務中,我們一直在仔細研究 符號。

上次,我們看到了如何使用 把可能需要很長時間運行的進程放到后臺運行。但是,& 與尖括號 結合使用,也可用于將輸出或輸出通過管道導向其他地方。

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

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,而對于 1 和 2,箭頭()是指向外部的。

標準文件描述符有什么用?

如果你在閱讀本系列以后,你已經多次使用標準輸出(1)的簡寫形式:。

例如,當(假如)你知道你的命令會拋出一個錯誤時,像 stderr(2)這樣的東西也很方便,但是 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

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

文件描述符入門

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

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

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

但這里存在一個問題:如果你想把命令拋出的錯誤信息記錄到文件,而結果中沒有錯誤信息你該怎么做?上面的命令并不會這樣做,因為它只寫入 find 正確的結果,而:

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

只會寫入命令拋出的錯誤信息。

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

find /etc -iname  *.service   services.txt

hellip; hellip; 再次和 打個招呼!

我們一直在說 stdin(0)、stdout(1)和 stderr(2)是“文件描述符”。文件描述符是一種特殊構造,是指向文件的通道,用于讀取或寫入,或兩者兼而有之。這來自于將所有內容都視為文件的舊  UNIX 理念。想寫一個設備?將其視為文件。想寫入套接字并通過網絡發送數據?將其視為文件。想要讀取和寫入文件?嗯,顯然,將其視為文件。

因此,在管理命令的輸出和錯誤的位置時,將目標視為文件。因此,當你打開它們來讀取和寫入它們時,它們都會獲得文件描述符。

這是一個有趣的效果。例如,你可以將內容從一個文件描述符傳遞到另一個文件描述符:

find /etc -iname  *.service 1  services.txt 2 1

這會將 stderr 導向到 stdout,而 stdout 通過管道被導向到一個文件中 services.txt 中。

它再次出現:發信號通知 Bash 1 是目標文件描述符。

標準文件描述符的另一個問題是,當你從一個管道傳輸到另一個時,你執行此操作的順序有點違反直覺。例如,按照上面的命令。它看起來像是錯誤的方式。你也行像這樣閱讀它:“將輸出導向到文件,然后將錯誤導向到標準輸出。”看起來錯誤輸出會在后面,并且在輸出到標準輸出(1)已經完成時才發送。

但這不是文件描述符的工作方式。文件描述符不是文件的占位符,而是文件的輸入和(或)輸出通道。在這種情況下,當你做 1 services.txt 時,你的意思是“打開一個寫管道到 services.txt 并保持打開狀態”。1 是你要使用的管道的名稱,它將保持打開狀態直到該行的結尾。

如果你仍然認為這是錯誤的方法,試試這個:

find /etc -iname  *.service 2 1 1 services.txt

并注意它是如何不工作的;注意錯誤是如何被導向到終端的,而只有非錯誤的輸出(即 stdout)被推送到 services.txt。

這是因為 Bash 從左到右處理 find 的每個結果。這樣想:當 Bash 到達 2 1 時,stdout(1)仍然是指向終端的通道。如果 find 給 Bash 的結果包含一個錯誤,它將被彈出到 2,轉移到 1,然后留在終端!

然后在命令結束時,Bash 看到你要打開 stdout(1)作為到 services.txt 文件的通道。如果沒有發生錯誤,結果將通過通道 1 進入文件。

相比之下,在:

find /etc -iname  *.service 1 services.txt 2 1

1 從一開始就指向 services.txt,因此任何彈出到 2 的內容都會導向到 1,而 1 已經指向最終去的位置 services.txt,這就是它工作的原因。

在任何情況下,如上所述 都是“標準輸出和標準錯誤”的縮寫,即 2 1。

這可能有點多,但不用擔心。重新導向文件描述符在 Bash 命令行和腳本中是司空見慣的事。

關于 Bash 中的&符號和文件描述符如何理解就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計2657字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 兴安盟| 绍兴县| 贵州省| 泸溪县| 靖远县| 哈尔滨市| 临汾市| 清河县| 中方县| 太和县| 武强县| 天峨县| 瑞昌市| 聂拉木县| 蕲春县| 宜宾市| 巴彦县| 德保县| 汉沽区| 梅州市| 越西县| 德江县| 内丘县| 黄骅市| 奈曼旗| 桦南县| 襄垣县| 天镇县| 嘉峪关市| 卢龙县| 大方县| 丰城市| 深州市| 易门县| 田阳县| 大厂| 利川市| 密云县| 宁远县| 芮城县| 新邵县|