UNIX 輸入/輸出重定向

2018-08-12 22:12 更新

輸入/輸出重定向

大多數(shù) UNIX 系統(tǒng)命令從你的終端接受輸入并將所產(chǎn)生的輸出發(fā)送回??到您的終端。一個(gè)命令通常從一個(gè)叫標(biāo)準(zhǔn)輸入的地方讀取輸入,默認(rèn)情況下,這恰好是你的終端。同樣,一個(gè)命令通常將其輸出寫入到標(biāo)準(zhǔn)輸出,默認(rèn)情況下,這也是你的終端。

輸出重定向

一個(gè)命令的輸出通常用于標(biāo)準(zhǔn)輸出,也可以很容易地將輸出轉(zhuǎn)移到一個(gè)文件。這種能力被稱為輸出重定向:

如果記號(hào) > file 添加到任何命令,這些命令通常將其輸出寫入到標(biāo)準(zhǔn)輸出,該命令的輸出將被寫入文件,而不是你的終端:

檢查下面的 who 命令,它將命令的完整的輸出重定向在用戶文件中。

    $ who > users

請(qǐng)注意,沒有輸出出現(xiàn)在終端中。這是因?yàn)檩敵鲆驯粡哪J(rèn)的標(biāo)準(zhǔn)輸出設(shè)備(終端)重定向到指定的文件。如果你想檢查 users 文件,它有完整的內(nèi)容:

    $ cat users
    oko tty01   Sep 12 07:30
    ai  tty15   Sep 12 13:32
    ruthtty21   Sep 12 10:10
    pat tty24   Sep 12 13:07
    steve   tty25   Sep 12 13:03
    $

如果命令輸出重定向到一個(gè)文件,該文件已經(jīng)包含了一些數(shù)據(jù),這些數(shù)據(jù)將會(huì)丟失??紤]這個(gè)例子:

    $ echo line 1 > users
    $ cat users
    line 1
    $

您可以使用 >> 運(yùn)算符將輸出添加在現(xiàn)有的文件如下:

    $ echo line 2 >> users
    $ cat users
    line 1
    line 2
    $

輸入重定向

正如一個(gè)命令的輸出可以被重定向到一個(gè)文件中,所以一個(gè)命令的輸入可以從文件重定向。大于號(hào) > 被用于輸出重定向,小于號(hào) <用于重定向一個(gè)命令的輸入。

通常從標(biāo)準(zhǔn)輸入獲取輸入的命令可以有自己的方式從文件進(jìn)行輸入重定向。例如,為了計(jì)算上面 user 生成的文件中的行數(shù),你可以執(zhí)行如下命令:

    $ wc -l users
    2 users
    $

在這里,它產(chǎn)生的輸出為 2 行。你可以通過從 user 文件進(jìn)行 wc 命令的標(biāo)準(zhǔn)輸入重定向:

    $ wc -l < users
    2
    $

請(qǐng)注意,兩種形式的 wc 命令產(chǎn)生的輸出是有區(qū)別的。在第一種情況下,用行數(shù)列出該文件的用戶的名稱,而在第二種情況下,它不是。

在第一種情況下,wc 知道,它是從文件用戶讀取輸入。在第二種情況下,只知道它是從標(biāo)準(zhǔn)輸入讀取輸入,所以它不顯示文件名。

Here 文檔

here document 被用來將輸入重定向到一個(gè)交互式 Shell 腳本或程序。

在一個(gè) Shell 腳本中,我們可以運(yùn)行一個(gè)交互式程序,無需用戶操作,通過提供互動(dòng)程序或交互式 Shell 腳本所需的輸入。

Here 文檔的一般形式是:

    command << delimiter
    document
    delimiter

這里的 Shell 將 << 操作符解釋為讀取輸入的指令,直到它找到含有指定的分隔符線。然后所有包含行分隔符的輸入行被送入命令的標(biāo)準(zhǔn)輸入。

分隔符告訴 Shell here 文檔已完成。沒有它,Shell 不斷的讀取輸入。分隔符必須是一個(gè)字符且不包含空格或制表符。

以下是輸入命令 wc -l 來進(jìn)行計(jì)算行的總數(shù):

    $wc -l << EOF
        This is a simple lookup program 
        for good (and bad) restaurants
        in Cape Town.
    EOF
    3
    $

可以用 here document 編譯多行,腳本如下:

    #!/bin/sh

    cat << EOF
    This is a simple lookup program 
    for good (and bad) restaurants
    in Cape Town.
    EOF 

這將產(chǎn)生以下結(jié)果:

    This is a simple lookup program
    for good (and bad) restaurants
    in Cape Town.

下面的腳本用 vi 文本編輯器運(yùn)行一個(gè)會(huì)話并且將輸入保存文件在 test.txt 中。

    #!/bin/sh

    filename=test.txt
    vi $filename <<EndOfCommands
    i
    This file was created automatically from
    a shell script
    ^[
    ZZ
    EndOfCommands

如果用 vim 作為 vi 來運(yùn)行這個(gè)腳本,那么很可能會(huì)看到以下的輸出:

    $ sh test.sh
    Vim: Warning: Input is not from a terminal
    $

運(yùn)行該腳本后,你應(yīng)該看到以下內(nèi)容添加到了文件 test.txt 中:

    $ cat test.txt
    This file was created automatically from
    a shell script
    $

丟棄輸出

有時(shí)你需要執(zhí)行命令,但不想在屏幕上顯示輸出。在這種情況下,你可以通過重定向到文件 /dev/null 以丟棄輸出:

    $ command > /dev/null

在這里 command 是要執(zhí)行的命令的名字。文件 /dev/null 是一個(gè)自動(dòng)丟棄其所有的輸入的特殊文件。

為了丟棄一個(gè)命令的輸出和它的錯(cuò)誤輸出,你可以使用標(biāo)準(zhǔn)重定向來將 STDOUT 重定向到 STDERR :

    $ command > /dev/null 2>&1

在這里,2 代表 STDERR , 1 代表 STDOUT??梢陨贤ㄟ^將 STDERR 重定向到 STDERR 來顯示一條消息,如下:

    $ echo message 1>&2

重定向命令

以下是可以用來重定向的命令的完整列表:

命令 描述
pgm > file pgm 的輸出被重定向到文件
pgm pgm 程序從文件度它的輸入
pgm >> file pgm 的輸出被添加到文件
n > file 帶有描述符 n 的輸出流重定向到文件
n >> file 帶有描述符 n 的輸出流添加到文件
n >& m 合并流 n 和 流 m 的輸出
n 合并流 n 和 流 m 的輸入
標(biāo)準(zhǔn)輸入從開始行的下一個(gè)標(biāo)記開始。
| 從一個(gè)程序或進(jìn)程獲取輸入,并將其發(fā)送到另一個(gè)程序或進(jìn)程。

需要注意的是文件描述符 0 通常是標(biāo)準(zhǔn)輸入(STDIN),1 是標(biāo)準(zhǔn)輸出(STDOUT),2 是標(biāo)準(zhǔn)錯(cuò)誤輸出(STDERR)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)