W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
既然我們已經(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的管道符命令組合。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: