3.1 輸入輸出重定向

2022-05-27 09:58 更新

既然我們已經(jīng)在上一章學(xué)完了幾乎所有基礎(chǔ)且常用的Linux命令,那么接下來的任務(wù)就是把多個(gè)Linux命令適當(dāng)?shù)亟M合到一起,使其協(xié)同工作,以便我們更加高效地處理數(shù)據(jù)。要做到這一點(diǎn),就必須搞明白命令的輸入重定向和輸出重定向的原理。

簡而言之,輸入重定向是指把文件導(dǎo)入到命令中,而輸出重定向則是指把原本要輸出到屏幕的數(shù)據(jù)信息寫入到指定文件中。在日常的學(xué)習(xí)和工作中,相較于輸入重定向,我們使用輸出重定向的頻率更高,所以又將輸出重定向分為了標(biāo)準(zhǔn)輸出重定向和錯(cuò)誤輸出重定向兩種不同的技術(shù),以及清空寫入與追加寫入兩種模式。聽起來就很玄妙?劉遄老師接下來將慢慢道來。

標(biāo)準(zhǔn)輸入重定向(STDIN,文件描述符為0):默認(rèn)從鍵盤輸入,也可從其他文件或命令中輸入。

標(biāo)準(zhǔn)輸出重定向(STDOUT,文件描述符為1):默認(rèn)輸出到屏幕。

錯(cuò)誤輸出重定向(STDERR,文件描述符為2):默認(rèn)輸出到屏幕。

比如我們分別查看兩個(gè)文件的屬性信息,其中第二個(gè)文件是不存在的,雖然針對(duì)這兩個(gè)文件的操作都分別會(huì)在屏幕上輸出一些數(shù)據(jù)信息,但這兩個(gè)操作的差異其實(shí)很大:

    [root@linuxprobe ~]# touch linuxprobe
    [root@linuxprobe ~]# ls -l linuxprobe 
    -rw-r--r--. 1 root root 0 Aug 5 05:35 linuxprobe
    [root@linuxprobe ~]# ls -l xxxxxx
    ls: cannot access xxxxxx: No such file or directory

在上述命令中,名為linuxprobe的文件是存在的,輸出信息是該文件的一些相關(guān)權(quán)限、所有者、所屬組、文件大小及修改時(shí)間等信息,這也是該命令的標(biāo)準(zhǔn)輸出信息。而名為xxxxxx的第二個(gè)文件是不存在的,因此在執(zhí)行完ls命令之后顯示的報(bào)錯(cuò)提示信息也是該命令的錯(cuò)誤輸出信息。那么,要想把原本輸出到屏幕上的數(shù)據(jù)轉(zhuǎn)而寫入到文件當(dāng)中,就要區(qū)別對(duì)待這兩種輸出信息。

對(duì)于輸入重定向來講,用到的符號(hào)及其作用如表3-1所示。

表3-1 輸入重定向中用到的符號(hào)及其作用

符號(hào) 作用
命令 < 文件 將文件作為命令的標(biāo)準(zhǔn)輸入
命令 << 分界符 從標(biāo)準(zhǔn)輸入中讀入,直到遇見分界符才停止
命令 < 文件1 > 文件2 將文件1作為命令的標(biāo)準(zhǔn)輸入并將標(biāo)準(zhǔn)輸出到文件2

表3-2 輸出重定向中用到的符號(hào)及其作用

符號(hào) 作用
命令 > 文件 將標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中(清空原有文件的數(shù)據(jù))
命令 2> 文件 將錯(cuò)誤輸出重定向到一個(gè)文件中(清空原有文件的數(shù)據(jù))
命令 >> 文件 將標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中(追加到原有內(nèi)容的后面)
命令 2>> 文件 將錯(cuò)誤輸出重定向到一個(gè)文件中(追加到原有內(nèi)容的后面)
命令 >> 文件 2>&1 或 命令 &>> 文件 將標(biāo)準(zhǔn)輸出與錯(cuò)誤輸出共同寫入到文件中(追加到原有內(nèi)容的后面)

對(duì)于重定向中的標(biāo)準(zhǔn)輸出模式,可以省略文件描述符1不寫,而錯(cuò)誤輸出模式的文件描述符2是必須要寫的。我們先來小試牛刀。通過標(biāo)準(zhǔn)輸出重定向?qū)an bash命令原本要輸出到屏幕的信息寫入到文件readme.txt中,然后顯示readme.txt文件中的內(nèi)容。具體命令如下:

    [root@linuxprobe ~]# man bash > readme.txt
    [root@linuxprobe ~]# cat readme.txt 
    BASH(1)                     General Commands Manual                    BASH(1)
    NAME
    bash - GNU Bourne-Again SHell


    SYNOPSIS
    bash [options] [file]


    COPYRIGHT
    Bash is Copyright (C) 1989-2011 by the Free Software Foundation, Inc.


    DESCRIPTION
    Bash  is  an  sh-compatible  command language interpreter that executes
    commands read from the standard input or from a file.  Bash also incor‐
    porates useful features from the Korn and C shells (ksh and csh).


    Bash  is  intended  to  be a conformant implementation of the Shell and
    Utilities portion  of  the  IEEE  POSIX  specification  (IEEE  Standard
    1003.1).  Bash can be configured to be POSIX-conformant by default.
    ………………省略部分輸出信息………………

有沒有感覺到很方便呢?我們接下來嘗試輸出重定向技術(shù)中的覆蓋寫入與追加寫入這兩種不同模式帶來的變化。首先通過覆蓋寫入模式向readme.txt文件寫入一行數(shù)據(jù)(該文件中包含上一個(gè)實(shí)驗(yàn)的man命令信息),然后再通過追加寫入模式向文件再寫入一次數(shù)據(jù),其命令如下:

    [root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
    [root@linuxprobe ~]# echo "Quality linux learning materials" >> readme.txt

在執(zhí)行cat命令之后,可以看到如下所示的文件內(nèi)容:

    [root@linuxprobe ~]# cat readme.txt
    Welcome to LinuxProbe.Com
    Quality linux learning materials

雖然都是輸出重定向技術(shù),但是不同命令的標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出還是有區(qū)別的。例如查看當(dāng)前目錄中某個(gè)文件的信息,這里以linuxprobe文件為例。因?yàn)檫@個(gè)文件是真實(shí)存在的,因此使用標(biāo)準(zhǔn)輸出即可將原本要輸出到屏幕的信息寫入到文件中,而錯(cuò)誤的輸出重定向則依然把信息輸出到了屏幕上。

    [root@linuxprobe ~]# ls -l linuxprobe 
    -rw-r--r--. 1 root root 0 Mar  1 13:30 linuxprobe
    [root@linuxprobe ~]# ls -l linuxprobe > /root/stderr.txt 
    [root@linuxprobe ~]# ls -l linuxprobe 2> /root/stderr.txt 
    -rw-r--r--. 1 root root 0 Mar  1 13:30 linuxprobe

如果想把命令的報(bào)錯(cuò)信息寫入到文件,該怎么操作呢?當(dāng)用戶在執(zhí)行一個(gè)自動(dòng)化的Shell腳本時(shí),這個(gè)操作會(huì)特別有用,而且特別實(shí)用,因?yàn)樗梢园颜麄€(gè)腳本執(zhí)行過程中的報(bào)錯(cuò)信息都記錄到文件中,便于安裝后的排錯(cuò)工作。接下來我們以一個(gè)不存在的文件進(jìn)行實(shí)驗(yàn)演示:

    [root@linuxprobe ~]# ls -l xxxxxx 
    cannot access xxxxxx: No such file or directory
    [root@linuxprobe ~]# ls -l xxxxxx > /root/stderr.txt
    cannot access xxxxxx: No such file or directory
    [root@linuxprobe ~]# ls -l xxxxxx 2> /root/stderr.txt
    [root@linuxprobe ~]# cat /root/stderr.txt 
    ls: cannot access xxxxxx: No such file or directory

輸入重定向相對(duì)來說有些冷門,在工作中遇到的概率會(huì)小一點(diǎn)。輸入重定向的作用是把文件直接導(dǎo)入到命令中。接下來使用輸入重定向把readme.txt文件導(dǎo)入給wc -l命令,統(tǒng)計(jì)一下文件中的內(nèi)容行數(shù)。

    [root@linuxprobe ~]# wc -l < readme.txt
    2

上述命令實(shí)際上等同于接下來要學(xué)習(xí)的cat readme.txt | wc -l的管道符命令組合。

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)