系統(tǒng)之家 - 系統(tǒng)光盤下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > 系統(tǒng)教程 > Linux重定向數(shù)據(jù)流

Linux系統(tǒng)如何重定向數(shù)據(jù)流?

時(shí)間:2015-09-08 15:08:21 作者:zhijie 來源:系統(tǒng)之家 1. 掃描二維碼隨時(shí)看資訊 2. 請(qǐng)使用手機(jī)瀏覽器訪問: https://m.xitongzhijia.net/xtjc/20150908/57138.html 手機(jī)查看 評(píng)論

  所謂的數(shù)據(jù)流就是按一定順序讀取的一串?dāng)?shù)據(jù),所以數(shù)據(jù)流的方向就是數(shù)據(jù)流的讀取順序,Linux系統(tǒng)重定向數(shù)據(jù)流就是把數(shù)據(jù)讀取后輸出的結(jié)果導(dǎo)入到其他文件中。那么Linux系統(tǒng)如何重定向數(shù)據(jù)流呢?

  數(shù)據(jù)流重定向

  下面簡單的回顧一下前面經(jīng)常用到的兩個(gè)重定向操作:

  $ echo ‘hello shiyanlou’ 》 redirect

  $ echo ‘www.shiyanlou.com’ 》》 redirect

  $ cat redirect

  當(dāng)然前面沒有用到的《和《《操作也是沒有問題的,如你理解的一樣,它們的區(qū)別在于重定向的方向不一致而已,》表示是從左到右,《右到左。

  1.簡單的重定向

  在更多了解 Linux 的重定向之前,需要先知道一些基本的東西,前面已經(jīng)提到過 Linux 默認(rèn)提供了三個(gè)特殊設(shè)備,用于終端的顯示和輸出,分別為stdin(標(biāo)準(zhǔn)輸入,對(duì)應(yīng)于你在終端的輸入),stdout(標(biāo)準(zhǔn)輸出,對(duì)應(yīng)于終端的輸出),stderr(標(biāo)準(zhǔn)錯(cuò)誤輸出,對(duì)應(yīng)于終端的輸出)。

  文件描述符

  設(shè)備文件

  說明

  0

  /dev/stdin

  標(biāo)準(zhǔn)輸入

  1

  /dev/stdout

  標(biāo)準(zhǔn)輸出

  2

  /dev/stderr

  標(biāo)準(zhǔn)錯(cuò)誤

  文件描述符:文件描述符在形式上是一個(gè)非負(fù)整數(shù)。實(shí)際上,它是一個(gè)索引值,指向內(nèi)核為每一個(gè)進(jìn)程所維護(hù)的該進(jìn)程打開文件的記錄表。當(dāng)程序打開一個(gè)現(xiàn)有文件或者創(chuàng)建一個(gè)新文件時(shí),內(nèi)核向進(jìn)程返回一個(gè)文件描述符。在程序設(shè)計(jì)中,一些涉及底層的程序編寫往往會(huì)圍繞著文件描述符展開。但是文件描述符這一概念往往只適用于 UNIX、Linux 這樣的操作系統(tǒng)。

  另外還有一個(gè)符號(hào)-,它可以同時(shí)作為前一個(gè)命令的。

  可以這樣使用這些文件描述符:

  默認(rèn)使用終端的標(biāo)準(zhǔn)輸入作為命令的輸入和標(biāo)準(zhǔn)輸出作為命令的輸出

  $ cat

 。ò碈trl+C退出)

  將cat的連續(xù)輸出(heredoc方式)重定向到一個(gè)文件

  $ mkdir Documents

  $ cat 》 Documents/test.c\~ 《《EOF

  #include 《stdio.h》

  int main()

  {

  printf(“hello world\n”);

  return 0;

  }

  EOF

  將一個(gè)文件作為命令的輸入,標(biāo)準(zhǔn)輸出作為命令的輸出

  $ cat Documents/test.c\~

  將echo命令通過管道傳過來的數(shù)據(jù)作為cat命令的輸入,將標(biāo)準(zhǔn)輸出作為命令的輸出

  $ echo ‘hi’ | cat

  將echo命令的輸出從默認(rèn)的標(biāo)準(zhǔn)輸出重定向到一個(gè)普通文件

  $ echo ‘hello shiyanlou’ 》 redirect

  $ cat redirect

Linux系統(tǒng)如何重定向數(shù)據(jù)流?

  注意不要將管道和重定向混淆,管道默認(rèn)是連接前一個(gè)命令的輸出到下一個(gè)命令的輸入,而重定向通常是需要一個(gè)文件來建立兩個(gè)命令的連接,仔細(xì)體會(huì)一下上述第三個(gè)操作和最后兩個(gè)操作的異同點(diǎn)。

  2.標(biāo)準(zhǔn)錯(cuò)誤重定向

  重定向標(biāo)準(zhǔn)輸出到文件,這是一個(gè)很實(shí)用的操作,另一個(gè)很實(shí)用的操作是將標(biāo)準(zhǔn)錯(cuò)誤重定向,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都被指向偽終端的屏幕顯示,所以經(jīng)?吹降囊粋(gè)命令的輸出通常是同時(shí)包含了標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤的結(jié)果的。比如下面的操作:

  # 使用cat 命令同時(shí)讀取兩個(gè)文件,其中一個(gè)存在,另一個(gè)不存在

  $ cat Documents/test.c\~ hello.c

  # 你可以看到除了正確輸出了前一個(gè)文件的內(nèi)容,還在末尾出現(xiàn)了一條錯(cuò)誤信息

  # 下面我們將輸出重定向到一個(gè)文件,根據(jù)我們前面的經(jīng)驗(yàn),這里將在看不到任何輸出了

  $ cat Documents/test.c\~ hello.c 》 somefile

Linux系統(tǒng)如何重定向數(shù)據(jù)流?

  遺憾的是,這里依然出現(xiàn)了那條錯(cuò)誤信息,這正是因?yàn)槿缥疑厦嬲f的那樣,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤雖然都指向終端屏幕,實(shí)際它們并不一樣。那有的時(shí)候我們就是要可以隱藏某些錯(cuò)誤或者警告,那又該怎么做呢。這就需要用到前面講的文件描述符了:

  # 將標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出,再將標(biāo)準(zhǔn)輸出重定向到文件,注意要將重定向到文件寫到前面

  $ cat Documents/test.c\~ hello.c 》somefile 2》&1

  # 或者只用bash提供的特殊的重定向符號(hào)“&”將標(biāo)準(zhǔn)錯(cuò)誤和標(biāo)準(zhǔn)輸出同時(shí)重定向到文件

  $ cat Documents/test.c\~ hello.c &》somefilehell

  注意你應(yīng)該在輸出重定向文件描述符前加上&,否則shell會(huì)當(dāng)做重定向到一個(gè)文件名為1的文件中

Linux系統(tǒng)如何重定向數(shù)據(jù)流?

  3.使用tee命令同時(shí)重定向到多個(gè)文件

  經(jīng)常你可能還有這樣的需求,除了將需要將輸出重定向到文件之外也需要將信息打印在終端,那么你可以使用tee命令來實(shí)現(xiàn):

  $ echo ‘hello shiyanlou’ | tee hello

Linux系統(tǒng)如何重定向數(shù)據(jù)流?

  4.永久重定向

  你應(yīng)該可以看出我們前面的重定向操作都只是臨時(shí)性的,即只對(duì)當(dāng)前命令有效,那如何做到“永久”有效呢,比如在一個(gè)腳本中,你需要某一部分的命令的輸出全部進(jìn)行重定向,難道要讓你在每個(gè)命令上面加上臨時(shí)重定向的操作嘛,當(dāng)然不需要,我們可以使用exec命令實(shí)現(xiàn)“永久”重定向。exec命令的作用是使用指定的命令替換當(dāng)前的 Shell,及使用一個(gè)進(jìn)程替換當(dāng)前進(jìn)程,或者指定新的重定向:

  # 先開啟一個(gè)子 Shell

  $ zsh

  # 使用exec替換當(dāng)前進(jìn)程的重定向,將標(biāo)準(zhǔn)輸出重定向到一個(gè)文件

  $ exec 1》somefile

  # 后面你執(zhí)行的命令的輸出都將被重定向到文件中,直到你退出當(dāng)前子shell,或取消exec的重定向(后面將告訴你怎么做)

  $ ls

  $ exit

  $ cat somefile

Linux系統(tǒng)如何重定向數(shù)據(jù)流?

  5.創(chuàng)建輸出文件描述符

  默認(rèn)在 Shell 中可以有9個(gè)打開的文件描述符,上面我們使用了也是它默認(rèn)提供的0,1,2號(hào)文件描述符,另外我們還可以使用3-8的文件描述符,只是它們默認(rèn)沒有打開而已,你可以使用下面命令查看當(dāng)前 Shell 進(jìn)程中打開的文件描述符:

  $ cd /dev/fd/;ls -Al

  同樣使用exec命令可以創(chuàng)建新的文件描述符:

  $ zsh

  $ exec 3》somefile

  # 先進(jìn)入目錄,再查看,否則你可能不能得到正確的結(jié)果,然后再回到上一次的目錄

  $ cd /dev/fd/;ls -Al;cd -

  # 注意下面的命令》與&之間不應(yīng)該有空格,如果有空格則會(huì)出錯(cuò)

  $ echo “this is test” 》&3

  $ cat somefile

  $ exit

Linux系統(tǒng)如何重定向數(shù)據(jù)流?

  6.關(guān)閉文件描述符

  如上面我們打開的3號(hào)文件描述符,可以使用如下操作將它關(guān)閉:

  $ exec 3》&-

  $ cd /dev/fd;ls -Al;cd -

  7.完全屏蔽命令的輸出

  在 Linux 中有一個(gè)被成為“黑洞”的設(shè)備文件,所以導(dǎo)入它的數(shù)據(jù)都將被“吞噬”。

  在類 UNIX 系統(tǒng)中,/dev/null,或稱空設(shè)備,是一個(gè)特殊的設(shè)備文件,它通常被用于丟棄不需要的輸出流,或作為用于輸入流的空文件,這些操作通常由重定向完成。讀取它則會(huì)立即得到一個(gè)EOF。

  我們可以利用設(shè)個(gè)/dev/null屏蔽命令的輸出:

  $ cat Documents/test.c\~ nefile 1》/dev/null 2》&1

  向上面這樣的操作將使你得不到任何輸出結(jié)果。

  8.使用 xargs 分割參數(shù)列表

  xargs 是一條 UNIX 和類 UNIX 操作系統(tǒng)的常用命令。它的作用是將參數(shù)列表轉(zhuǎn)換成小塊分段傳遞給其他命令,以避免參數(shù)列表過長的問題。

  這個(gè)命令在有些時(shí)候十分有用,特別是當(dāng)用來處理產(chǎn)生大量輸出結(jié)果的命令如 find,locate 和 grep 的結(jié)果,詳細(xì)用法請(qǐng)參看 man 文檔。

  $ cut -d: -f1 《 /etc/passwd | sort | xargs echo

  上面這個(gè)命令用于將/etc/passwd文件按:分割取第一個(gè)字段排序后,使用echo命令生成一個(gè)列表。

  以上就是Linux系統(tǒng)重定向數(shù)據(jù)流的方法了,實(shí)際上重新定向數(shù)據(jù)流以后,就是把輸出導(dǎo)向另一個(gè)文件中了。

發(fā)表評(píng)論

0

沒有更多評(píng)論了

評(píng)論就這些咯,讓大家也知道你的獨(dú)特見解

立即評(píng)論

以上留言僅代表用戶個(gè)人觀點(diǎn),不代表系統(tǒng)之家立場(chǎng)

其他版本軟件

熱門教程

人氣教程排行

Linux系統(tǒng)推薦

掃碼關(guān)注
掃碼關(guān)注

掃碼關(guān)注 官方交流群 軟件收錄