最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Bash中文件描述符的詳細(xì)介紹

 更新時(shí)間:2018年04月22日 10:41:11   作者:始于珞塵  
這篇文章主要給大家介紹了關(guān)于Bash中文件描述符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

Linux將所有內(nèi)核對(duì)象當(dāng)做文件來處理,系統(tǒng)用一個(gè)size_t類型來表示一個(gè)文件對(duì)象,比如對(duì)于文件描述符0就表示系統(tǒng)的標(biāo)準(zhǔn)輸入設(shè)備STDIN,通常情況下STDIN的值為鍵盤,如read命令就默認(rèn)從STDIN讀取數(shù)據(jù),當(dāng)然STDIN的值是可以改變的,比如將其改成其他文件,這樣的話想read等命令就會(huì)默認(rèn)從相應(yīng)的文件讀取數(shù)據(jù)了。

簡(jiǎn)單地說,一個(gè)文件描述符可以和一個(gè)文件掛鉤,一旦掛鉤就可以通過取地址運(yùn)算符&獲得該文件的句柄,比如&0就可以獲得STDIN設(shè)備在內(nèi)存中的句柄(設(shè)備在系統(tǒng)中也被當(dāng)做文件處理),可以這樣理解,如果是一個(gè)shell中的普通變量var,可以通過$var的形式獲得該變量所代表的值,而對(duì)于一個(gè)文件描述符fd,則可以通過&fd的形式獲得文件描述符指向的文件的句柄,而這個(gè)句柄可以簡(jiǎn)單地理解成該文件的路徑。

在 Shell 編程里經(jīng)常會(huì)用到重定向操作, 它本質(zhì)上是對(duì)文件描述符進(jìn)行操作, 本文會(huì)對(duì) Shell 腳本里的文件描述符做一個(gè)詳細(xì)的介紹.

默認(rèn)標(biāo)準(zhǔn)文件描述符

每個(gè)進(jìn)程啟動(dòng)時(shí)默認(rèn)都會(huì)有三個(gè)標(biāo)準(zhǔn)的文件描述符:

  • stdin 0 號(hào)描述符, 代表輸入設(shè)備, 進(jìn)程從它讀入數(shù)據(jù);
  • stdout 1 號(hào)描述符, 進(jìn)程往其中寫入數(shù)據(jù);
  • stderr 2 號(hào)描述符, 進(jìn)程會(huì)往其中寫入錯(cuò)誤信息;

這三個(gè)描述符默認(rèn)是對(duì)應(yīng)同一個(gè) tty 設(shè)備, 這樣我們便可以在終端中輸入數(shù)據(jù)和獲取進(jìn)程的輸出.

默認(rèn)的文件描述符也是可以被替換的, 例如我們可以替換掉 stdout 到一個(gè)文件, 這樣命令的輸出就不是打印到終端, 而是被輸出到文件中:

在上面的 demo 中, 我們先是通過 exec 1 > /tmp/stdout 把 stdout 指向了文件 /tmp/stdout, 緊接著我們執(zhí)行了兩條命令 ls 和 pwd, 可以看到此時(shí)終端已經(jīng)沒有了命令的輸出. 當(dāng)我們通過 exec 1 >&2 恢復(fù) stdout 后, 可以發(fā)現(xiàn)文件 /tmp/stdout 里存儲(chǔ)了之前命令的輸出.

其中 exec 是一個(gè) bash 內(nèi)置命令, 不同于在終端中執(zhí)行命令時(shí)會(huì) fork 一個(gè)子進(jìn)程, 通過 exec 執(zhí)行的命令會(huì)直接修改當(dāng)前的 shell 進(jìn)程, 可以通過它執(zhí)行命令來修改當(dāng)前 shell 的 context.

如果你想使壞的話可以在別人的 ~/.bashrc 里加入 exec 1 > /tmp/stdout, 這樣新開的所有的終端窗口里都看不到命令的輸出, 要是因此被打概不負(fù)責(zé) :) .

文件描述符的操作

Shell 中對(duì)文件描述符的操作由三部分組成: (Left, Operation, Right):

  • Left 可以是 0-9 的數(shù)字, 代表第 n 號(hào)文件描述符;
         Left 還可以為 &, 表示同時(shí)操作 stdout 和 stderr
  • Right 可以是文件名或 0-9 的數(shù)字, 當(dāng) Right 是數(shù)字時(shí)必須要加上 & 符號(hào), 表示引用第 n 號(hào)文件描述符;
         Right 還可以為 &-, 此時(shí)表示關(guān)閉 Left 描述符, 例如 2<&- 表示關(guān)閉 stderr;
  • Operation 可以為 < 或 >;
         為 < 時(shí)表示以讀模式復(fù)制 Right 到 Left, 此時(shí)如果沒有指定 Left 的話, 則為默認(rèn)值 0;
         當(dāng)為 > 表示以寫模式復(fù)制 Right 到 Left, 此時(shí)如果沒有指定 Left 的話, 則為默認(rèn)值 1;
         Operation 和 Left 之間不能有空格;
         當(dāng) Right 為文件名時(shí), Operation 和 Right 可以有空格, 否則也不能有空格;

當(dāng)存在多個(gè)文件描述符的操作時(shí), 會(huì)按照從左往右的順序依次執(zhí)行. 例如通過命令 cmd 3>&1 1>&2 2>&3 3>&- 就可以交換 stdin 和 stdout.

我們通過下面的例子來驗(yàn)證上面的文件描述符交換是否生效:

  • 首先把默認(rèn)的 stderr 重定向到文件 /tmp/stderr 中, 這樣在終端中就不會(huì)看到錯(cuò)誤輸出了;
  • 當(dāng)交換完 stderr 和 stdout 后, 我們就可以在 /tmp/stderr 文件中看到命令的正常輸出了;

讓我們來開始實(shí)驗(yàn)吧:

➜ test exec 2> /tmp/stderr
➜ test ls
a.txt
➜ test ls 3>&1 1>&2 2>&3 3>&-
➜ test cat /tmp/stderr
a.txt

和我們的預(yù)期時(shí)一致的!

一些示例

用文件重載 stdin :

➜ test cat 0< a.txt
hello
➜ test cat < a.txt # same with last command
hello

把 stderr 和 stdout 都過濾掉

ls not_exist 1> /dev/zero 2>&1
# another way
ls not_exist &> /dev/zero

處理上一個(gè)命令的錯(cuò)誤輸出:

➜ blog git:(hexo) ls not_exist 2>&1 | sed 's/not_exist/error/g'
ls: error: No such file or directory
# another way
➜ blog git:(hexo) ls not_exist |& sed 's/not_exist/error/g'
ls: error: No such file or directory

把標(biāo)準(zhǔn)輸出轉(zhuǎn)入到錯(cuò)誤輸出上: echo hello 1>&2

Process Substitution

在 bash 中提供了兩個(gè)特殊的操作, 它們都可以被直接當(dāng)成文件名使用:

  • <(cmd) : 可以看作時(shí)一個(gè)可讀文件, cmd 命令的輸出是這個(gè)文件的內(nèi)容;
  • >(cmd) : 可以看作時(shí)一個(gè)可寫文件, cmd 會(huì)接受輸入并進(jìn)行處理;

示例

利用 <(cmd) 來驗(yàn)證一對(duì)公私鑰是否匹配:

➜ blog git:(hexo) diff <(ssh-keygen -y -e -f ~/.ssh/id_rsa) <(ssh-keygen -y -e -f ~/.ssh/id_rsa.pub)
➜ blog git:(hexo)

利用 >(cmd) 來對(duì)錯(cuò)誤信息進(jìn)行處理, 同時(shí)保證錯(cuò) stderr 信息不回變成 stdout:

➜ blog git:(hexo) ls not_exist 2> >(sed 's/not_exist/keep_error/g')
ls: keep_error: No such file or directory
➜ blog git:(hexo)

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

References

相關(guān)文章

  • Linux yum 命令安裝mysql8.0的教程詳解

    Linux yum 命令安裝mysql8.0的教程詳解

    這篇文章主要介紹了Linux yum 命令安裝mysql8.0的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • Linux VPS安全設(shè)置之三:使用DDOS deflate抵御少量DDOS攻擊

    Linux VPS安全設(shè)置之三:使用DDOS deflate抵御少量DDOS攻擊

    這篇文章主要介紹了Linux VPS安全設(shè)置之三:使用DDOS deflate抵御少量DDOS攻擊,需要的朋友可以參考下
    2016-10-10
  • Linux系統(tǒng)使用用戶密鑰ssh主機(jī)訪問

    Linux系統(tǒng)使用用戶密鑰ssh主機(jī)訪問

    這篇文章主要介紹了Linux系統(tǒng)使用用戶密鑰ssh主機(jī)訪問,它在安全上完全大于直接輸入root 的密碼,有需要的可以了解一下。
    2016-10-10
  • linux安裝單機(jī)版HBase的詳細(xì)過程

    linux安裝單機(jī)版HBase的詳細(xì)過程

    這篇文章主要介紹了linux安裝單機(jī)版HBase的詳細(xì)過程,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • CentOS6.6安裝CloudStack4.8

    CentOS6.6安裝CloudStack4.8

    CloudStack是一個(gè)開源的具有高可用性及擴(kuò)展性的云計(jì)算平臺(tái)。接下來通過本文給大家介紹CentOS6.6安裝CloudStack4.8的方法,感興趣的朋友一起看看吧
    2016-10-10
  • Linux服務(wù)器搭建nvidia-docker環(huán)境過程詳解

    Linux服務(wù)器搭建nvidia-docker環(huán)境過程詳解

    這篇文章主要介紹了Linux服務(wù)器搭建nvidia-docker環(huán)境過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • vscode連接遠(yuǎn)程Linux服務(wù)器及免密登陸的詳細(xì)步驟

    vscode連接遠(yuǎn)程Linux服務(wù)器及免密登陸的詳細(xì)步驟

    這篇文章主要介紹了vscode連接遠(yuǎn)程Linux服務(wù)器及免密登陸,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Linux tar命令使用列子

    Linux tar命令使用列子

    對(duì)許多用戶來說,在DOS和Windows環(huán)境下利用工具軟件WinZip、ARJ等壓縮或解壓文件是比較容易的事。但是,在Linux中如何對(duì)文件進(jìn)行壓縮與解壓呢?
    2008-06-06
  • telnet?nc命令返回“連接失敗”問題及解決

    telnet?nc命令返回“連接失敗”問題及解決

    當(dāng)使用nc或telnet命令測(cè)試端口連接時(shí),如果返回“connection?refused”錯(cuò)誤,通??赡苁且?yàn)椋?.?目標(biāo)端口未被監(jiān)聽,即沒有服務(wù)在運(yùn)行于該端口;2.?防火墻策略阻止了該端口的連接;3.?目標(biāo)主機(jī)配置了只允許特定IP或子網(wǎng)的連接,這些情況都會(huì)導(dǎo)致連接嘗試失敗
    2024-10-10
  • environments was not found on the java.library.path 問題的解決方法

    environments was not found on the java.library.path 問題的解決方法

    The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path 問題的解決方法,需要的朋友可以參考下
    2016-08-08

最新評(píng)論

南木林县| 常熟市| 泸州市| 抚松县| 治县。| 东乌珠穆沁旗| 澄迈县| 卢湾区| 兴海县| 九寨沟县| 奇台县| 孟津县| 革吉县| 宜君县| 蓬溪县| 万源市| 清丰县| 麻栗坡县| 从化市| 井冈山市| 东台市| 延吉市| 栾城县| 洛隆县| 峡江县| 洪泽县| 隆尧县| 绵阳市| 郓城县| 永丰县| 沙雅县| 宝丰县| 奇台县| 五河县| 普洱| 武胜县| 沂南县| 蓝山县| 西华县| 色达县| 新民市|