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

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

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

前言

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

簡(jiǎn)單地說(shuō),一個(gè)文件描述符可以和一個(gè)文件掛鉤,一旦掛鉤就可以通過(guò)取地址運(yùn)算符&獲得該文件的句柄,比如&0就可以獲得STDIN設(shè)備在內(nèi)存中的句柄(設(shè)備在系統(tǒng)中也被當(dāng)做文件處理),可以這樣理解,如果是一個(gè)shell中的普通變量var,可以通過(guò)$var的形式獲得該變量所代表的值,而對(duì)于一個(gè)文件描述符fd,則可以通過(guò)&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)程往其中寫(xiě)入數(shù)據(jù);
  • stderr 2 號(hào)描述符, 進(jìn)程會(huì)往其中寫(xiě)入錯(cuò)誤信息;

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

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

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

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

如果你想使壞的話(huà)可以在別人的 ~/.bashrc 里加入 exec 1 > /tmp/stdout, 這樣新開(kāi)的所有的終端窗口里都看不到命令的輸出, 要是因此被打概不負(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í)如果沒(méi)有指定 Left 的話(huà), 則為默認(rèn)值 0;
         當(dāng)為 > 表示以寫(xiě)模式復(fù)制 Right 到 Left, 此時(shí)如果沒(méi)有指定 Left 的話(huà), 則為默認(rèn)值 1;
         Operation 和 Left 之間不能有空格;
         當(dāng) Right 為文件名時(shí), Operation 和 Right 可以有空格, 否則也不能有空格;

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

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

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

讓我們來(lái)開(kāi)始實(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 都過(guò)濾掉

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è)可寫(xiě)文件, cmd 會(huì)接受輸入并進(jìn)行處理;

示例

利用 <(cmd) 來(lái)驗(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) 來(lái)對(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à)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(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)使用用戶(hù)密鑰ssh主機(jī)訪問(wèn)

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

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

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

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

    CentOS6.6安裝CloudStack4.8

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

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

    這篇文章主要介紹了Linux服務(wù)器搭建nvidia-docker環(huán)境過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(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ì)許多用戶(hù)來(lái)說(shuō),在DOS和Windows環(huán)境下利用工具軟件WinZip、ARJ等壓縮或解壓文件是比較容易的事。但是,在Linux中如何對(duì)文件進(jìn)行壓縮與解壓呢?
    2008-06-06
  • telnet?nc命令返回“連接失敗”問(wèn)題及解決

    telnet?nc命令返回“連接失敗”問(wèn)題及解決

    當(dāng)使用nc或telnet命令測(cè)試端口連接時(shí),如果返回“connection?refused”錯(cuò)誤,通常可能是因?yàn)椋?.?目標(biāo)端口未被監(jiān)聽(tīng),即沒(méi)有服務(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 問(wèn)題的解決方法

    environments was not found on the java.library.path 問(wèn)題的解決方法

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

最新評(píng)論

安远县| 施秉县| 平和县| 柏乡县| 堆龙德庆县| 丰县| 夹江县| 保山市| 冀州市| 东阿县| 双牌县| 图们市| 合川市| 垣曲县| 简阳市| 长丰县| 灌阳县| 拜城县| 河间市| 睢宁县| 南涧| 七台河市| 安多县| 天峻县| 五峰| 万山特区| 南充市| 开化县| 乐山市| 双鸭山市| 板桥市| 彰武县| 马龙县| 宁远县| 上饶市| 石屏县| 扬州市| 仙居县| 迁西县| 平阳县| 凤山县|