成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Bash中的&符號和文件描述符

系統(tǒng) Linux
了解如何將 “&” 與尖括號結(jié)合使用,并從命令行中獲得更多信息。在我們探究大多數(shù)鏈?zhǔn)?Bash 命令中出現(xiàn)的所有的雜項符號(&、|、;、>、<、{、[、(、)、]、} 等等)的任務(wù)中,我們一直在仔細(xì)研究 & 符號。

[[258823]]

了解如何將 “&” 與尖括號結(jié)合使用,并從命令行中獲得更多信息。

在我們探究大多數(shù)鏈?zhǔn)?Bash 命令中出現(xiàn)的所有的雜項符號(&、|、;、><{[(、)、]、} 等等)的任務(wù)中,我們一直在仔細(xì)研究 & 符號

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

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

  1. ls > list.txt

ls 輸出傳遞給 list.txt 文件。

現(xiàn)在我們看到的是簡寫:

  1. ls 1> list.txt

在這種情況下,1 是一個文件描述符,指向標(biāo)準(zhǔn)輸出(stdout)。

以類似的方式,2 指向標(biāo)準(zhǔn)錯誤輸出(stderr):

  1. ls 2> error.log

所有錯誤消息都通過管道傳遞給 error.log 文件。

回顧一下:1> 是標(biāo)準(zhǔn)輸出(stdout),2> 是標(biāo)準(zhǔn)錯誤輸出(stderr)。

第三個標(biāo)準(zhǔn)文件描述符,0< 是標(biāo)準(zhǔn)輸入(stdin)。你可以看到它是一個輸入,因為箭頭(<)指向0,而對于 12,箭頭(>)是指向外部的。

標(biāo)準(zhǔn)文件描述符有什么用?

如果你在閱讀本系列以后,你已經(jīng)多次使用標(biāo)準(zhǔn)輸出(1>)的簡寫形式:>。

例如,當(dāng)(假如)你知道你的命令會拋出一個錯誤時,像 stderr2)這樣的東西也很方便,但是 Bash 告訴你的東西是沒有用的,你不需要看到它。如果要在 home/ 目錄中創(chuàng)建目錄,例如:

  1. mkdir newdir

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

  1. mkdir newdir 2> /dev/null

這不僅僅是 “讓我們不要看到丑陋和無關(guān)的錯誤消息,因為它們很煩人”,因為在某些情況下,錯誤消息可能會在其他地方引起一連串錯誤。比如說,你想找到 /etc 下所有的 .service 文件。你可以這樣做:

  1. find /etc -iname "*.service"

但事實證明,在大多數(shù)系統(tǒng)中,find 顯示的錯誤會有許多行,因為普通用戶對 /etc 下的某些文件夾沒有讀取訪問權(quán)限。它使讀取正確的輸出變得很麻煩,如果 find 是更大的腳本的一部分,它可能會導(dǎo)致行中的下一個命令排隊。

相反,你可以這樣做:

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

而且你只得到你想要的結(jié)果。

文件描述符入門

單獨(dú)的文件描述符 stdoutstderr 還有一些注意事項。如果要將輸出存儲在文件中,請執(zhí)行以下操作:

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

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

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

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

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

我們?nèi)绾蔚玫絻烧撸空垏L試以下命令:

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

…… 再次和 & 打個招呼!

我們一直在說 stdin0)、stdout1)和 stderr2)是“文件描述符”。文件描述符是一種特殊構(gòu)造,是指向文件的通道,用于讀取或?qū)懭?,或兩者兼而有之。這來自于將所有內(nèi)容都視為文件的舊 UNIX 理念。想寫一個設(shè)備?將其視為文件。想寫入套接字并通過網(wǎng)絡(luò)發(fā)送數(shù)據(jù)?將其視為文件。想要讀取和寫入文件?嗯,顯然,將其視為文件。

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

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

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

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

它再次出現(xiàn):& 發(fā)信號通知 Bash 1 是目標(biāo)文件描述符。

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

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

如果你仍然認(rèn)為這是錯誤的方法,試試這個:

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

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

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

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

相比之下,在:

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

1 從一開始就指向 services.txt,因此任何彈出到 2 的內(nèi)容都會導(dǎo)向到 1 ,而 1 已經(jīng)指向最終去的位置 services.txt,這就是它工作的原因。

在任何情況下,如上所述 &> 都是“標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤”的縮寫,即 2>&1。

這可能有點多,但不用擔(dān)心。重新導(dǎo)向文件描述符在 Bash 命令行和腳本中是司空見慣的事。隨著本系列的深入,你將了解更多關(guān)于文件描述符的知識。 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2025-01-10 15:13:38

2023-04-06 15:22:15

Linux進(jìn)程系統(tǒng)

2012-08-08 10:31:41

IBMdW

2020-02-07 18:16:01

進(jìn)程線程底層原理

2023-12-13 14:01:34

Elasticsea文件描述符操作系統(tǒng)

2021-06-18 06:02:24

內(nèi)核文件傳遞

2019-07-09 15:30:31

Linuxulimit文件描述符

2019-07-09 14:30:16

LinuxJava 服務(wù)器

2016-10-28 21:55:28

Javascript屬性特性屬性描述符

2009-07-08 09:46:45

Servlet注釋部署描述符

2017-02-05 10:06:53

Python黑魔法描述符

2021-05-19 14:48:58

Linux文件fd

2009-09-04 14:04:53

C#文檔

2019-07-05 14:20:45

RPC服務(wù)器模型

2016-08-23 17:21:51

UnixLinux重定向

2021-01-18 10:15:40

tee命令BashLinux

2014-02-12 10:58:05

Linux文件夾文件權(quán)限

2010-06-23 16:19:48

Linux Bash

2011-08-25 14:03:36

creat中文man

2011-08-25 14:19:52

open中文man
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩欧美国产综合 | 久久国产精品久久久久久 | 亚洲永久字幕 | 国产欧美日韩二区 | 中文字幕一区二区三区日韩精品 | 成人免费视频网址 | 亚洲精品久久久久中文字幕欢迎你 | 精品国产18久久久久久二百 | 久久久久久色 | 一级国产精品一级国产精品片 | www性色 | 日本高清视频在线播放 | 黄视频网站免费观看 | 99热国产免费 | 在线看片网站 | 日韩中文字幕视频在线 | 亚洲福利视频一区二区 | 最近日韩中文字幕 | 亚洲一二三区精品 | 四虎影院在线播放 | 欧美9999 | 午夜二区 | 一区二区中文字幕 | 免费一区| 在线天堂免费中文字幕视频 | 中文字幕欧美一区二区 | 亚洲精品在线观看视频 | 欧美国产精品一区二区三区 | 午夜视频在线观看一区二区 | 国产成人久久av免费高清密臂 | 久亚州在线播放 | 亚洲欧美中文日韩在线v日本 | 久久性色 | 一区二区视频在线 | 亚洲狠狠爱 | 亚洲婷婷六月天 | 免费看a | 91精品一区 | 美女一区| 免费xxxx大片国产在线 | 精区3d动漫一品二品精区 |