鍍金池/ 教程/ Linux/ 輸入/輸出重定向
通信工具
信號和 Traps
文件管理
vi 編輯器使用向?qū)?/span>
替代
變量
環(huán)境
進程管理
實用工具
引用機制
Manpage 幫助
文件系統(tǒng)基礎(chǔ)知識
系統(tǒng)日志
循環(huán)
正則表達(dá)式和 SED
目錄
函數(shù)
管道和過濾器
特殊變量
輸入/輸出重定向
系統(tǒng)性能
用戶管理
循環(huán)控制
決策
什么是 UNIX ?
數(shù)組
什么是 Shell 腳本
基本操作符
文件權(quán)限

輸入/輸出重定向

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

輸出重定向

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

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

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

    $ who > users

請注意,沒有輸出出現(xiàn)在終端中。這是因為輸出已被從默認(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
    $

如果命令輸出重定向到一個文件,該文件已經(jīng)包含了一些數(shù)據(jù),這些數(shù)據(jù)將會丟失。考慮這個例子:

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

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

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

輸入重定向

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

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

    $ wc -l users
    2 users
    $

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

    $ wc -l < users
    2
    $

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

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

Here 文檔

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

在一個 Shell 腳本中,我們可以運行一個交互式程序,無需用戶操作,通過提供互動程序或交互式 Shell 腳本所需的輸入。

Here 文檔的一般形式是:

    command << delimiter
    document
    delimiter

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

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

以下是輸入命令 wc -l 來進行計算行的總數(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 文本編輯器運行一個會話并且將輸入保存文件在 test.txt 中。

    #!/bin/sh

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

如果用 vim 作為 vi 來運行這個腳本,那么很可能會看到以下的輸出:

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

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

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

丟棄輸出

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

    $ command > /dev/null

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

為了丟棄一個命令的輸出和它的錯誤輸出,你可以使用標(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)輸入從開始行的下一個標(biāo)記開始。
| 從一個程序或進程獲取輸入,并將其發(fā)送到另一個程序或進程。

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

上一篇:管道和過濾器下一篇:引用機制