日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
LinuxShell重定向(輸入輸出重定向)精講
Linux Shell 重定向分為兩種,一種輸入重定向,一種是輸出重定向;從字面上理解,輸入輸出重定向就是「改變輸入與輸出的方向」的意思。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供霸州網(wǎng)站建設(shè)、霸州做網(wǎng)站、霸州網(wǎng)站設(shè)計(jì)、霸州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、霸州企業(yè)網(wǎng)站模板建站服務(wù),十多年霸州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

那么,什么是輸入輸出方向呢?標(biāo)準(zhǔn)的輸入輸出方向又是什么呢?

一般情況下,我們都是從鍵盤讀取用戶輸入的數(shù)據(jù),然后再把數(shù)據(jù)拿到程序(C語(yǔ)言程序、Shell 腳本程序等)中使用;這就是標(biāo)準(zhǔn)的輸入方向,也就是從鍵盤到程序。

反過(guò)來(lái)說(shuō),程序中也會(huì)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)一般都是直接呈現(xiàn)到顯示器上,這就是標(biāo)準(zhǔn)的輸出方向,也就是從程序到顯示器。

我們可以把觀點(diǎn)提煉一下,其實(shí)輸入輸出方向就是數(shù)據(jù)的流動(dòng)方向:

  • 輸入方向就是數(shù)據(jù)從哪里流向程序。數(shù)據(jù)默認(rèn)從鍵盤流向程序,如果改變了它的方向,數(shù)據(jù)就從其它地方流入,這就是輸入重定向。
  • 輸出方向就是數(shù)據(jù)從程序流向哪里。數(shù)據(jù)默認(rèn)從程序流向顯示器,如果改變了它的方向,數(shù)據(jù)就流向其它地方,這就是輸出重定向。

硬件設(shè)備和文件描述符

計(jì)算機(jī)的硬件設(shè)備有很多,常見(jiàn)的輸入設(shè)備有鍵盤、鼠標(biāo)、麥克風(fēng)、手寫板等,輸出設(shè)備有顯示器、投影儀、打印機(jī)等。不過(guò),在 Linux 中,標(biāo)準(zhǔn)輸入設(shè)備指的是鍵盤,標(biāo)準(zhǔn)輸出設(shè)備指的是顯示器。

Linux 中一切皆文件,包括標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)和標(biāo)準(zhǔn)輸出設(shè)備(顯示器)在內(nèi)的所有計(jì)算機(jī)硬件都是文件。

為了表示和區(qū)分已經(jīng)打開(kāi)的文件,Linux 會(huì)給每個(gè)文件分配一個(gè) ID,這個(gè) ID 就是一個(gè)整數(shù),被稱為
文件描述符(File Descriptor)。

表1:與輸入輸出有關(guān)的文件描述符
文件描述符 文件名 類型 硬件
0 stdin 標(biāo)準(zhǔn)輸入文件 鍵盤
1 stdout 標(biāo)準(zhǔn)輸出文件 顯示器
2 stderr 標(biāo)準(zhǔn)錯(cuò)誤輸出文件 顯示器

Linux 程序在執(zhí)行任何形式的 I/O 操作時(shí),都是在讀取或者寫入一個(gè)文件描述符。一個(gè)文件描述符只是一個(gè)和打開(kāi)的文件相關(guān)聯(lián)的整數(shù),它的背后可能是一個(gè)硬盤上的普通文件、FIFO、管道、終端、鍵盤、顯示器,甚至是一個(gè)網(wǎng)絡(luò)連接。

stdin、stdout、stderr 默認(rèn)都是打開(kāi)的,在重定向的過(guò)程中,0、1、2 這三個(gè)文件描述符可以直接使用。

Linux Shell 輸出重定向

輸出重定向是指命令的結(jié)果不再輸出到顯示器上,而是輸出到其它地方,一般是文件中。這樣做的最大好處就是把命令的結(jié)果保存起來(lái),當(dāng)我們需要的時(shí)候可以隨時(shí)查詢。Bash 支持的輸出重定向符號(hào)如下表所示。

表2:Bash 支持的輸出重定向符號(hào)
類 型 符 號(hào) 作 用
標(biāo)準(zhǔn)輸出重定向 command >file 以覆蓋的方式,把 command 的正確輸出結(jié)果輸出到 file 文件中。
command >>file 以追加的方式,把 command 的正確輸出結(jié)果輸出到 file 文件中。
標(biāo)準(zhǔn)錯(cuò)誤輸出重定向 command 2>file 以覆蓋的方式,把 command 的錯(cuò)誤信息輸出到 file 文件中。
command 2>>file 以追加的方式,把 command 的錯(cuò)誤信息輸出到 file 文件中。
正確輸出和錯(cuò)誤信息同時(shí)保存 command >file 2>&1 以覆蓋的方式,把正確輸出和錯(cuò)誤信息同時(shí)保存到同一個(gè)文件(file)中。
command >>file 2>&1 以追加的方式,把正確輸出和錯(cuò)誤信息同時(shí)保存到同一個(gè)文件(file)中。
command >file1 2>file2 以覆蓋的方式,把正確的輸出結(jié)果輸出到 file1 文件中,把錯(cuò)誤信息輸出到 file2 文件中。
command >>file1  2>>file2 以追加的方式,把正確的輸出結(jié)果輸出到 file1 文件中,把錯(cuò)誤信息輸出到 file2 文件中。
command >file 2>file 不推薦】這兩種寫法會(huì)導(dǎo)致 file 被打開(kāi)兩次,引起資源競(jìng)爭(zhēng),所以 stdout 和 stderr 會(huì)互相覆蓋,我們將在《結(jié)合Linux文件描述符談重定向,徹底理解重定向的本質(zhì)》一節(jié)中深入剖析。
command >>file 2>>file

在輸出重定向中,
>代表的是覆蓋,
>>代表的是追加。

注意

輸出重定向的完整寫法其實(shí)是
fd>file或者
fd>>file,其中 fd 表示文件描述符,如果不寫,默認(rèn)為 1,也就是標(biāo)準(zhǔn)輸出文件。

當(dāng)文件描述符為 1 時(shí),一般都省略不寫,如上表所示;當(dāng)然,如果你愿意,也可以將
command >file寫作
command 1>file,但這樣做是多此一舉。

當(dāng)文件描述符為大于 1 的值時(shí),比如 2,就必須寫上。

需要重點(diǎn)說(shuō)明的是,
fd
>之間不能有空格,否則 Shell 會(huì)解析失??;
>
file之間的空格可有可無(wú)。為了保持一致,我習(xí)慣在
>兩邊都不加空格。

下面的語(yǔ)句是一個(gè)反面教材:

echo "c.biancheng.net" 1 >log.txt

注意
1
>之間的空格。echo 命令的輸出結(jié)果是
c.biancheng.net,我們的初衷是將輸出結(jié)果重定向到 log.txt,但是當(dāng)你打開(kāi) log.txt 文件后,發(fā)現(xiàn)文件的內(nèi)容為
c.biancheng.net 1,這就是多余的空格導(dǎo)致的解析錯(cuò)誤。也就是說(shuō),Shell 將該條語(yǔ)句理解成了下面的形式:

echo "c.biancheng.net" 1 1>log.txt

輸出重定向舉例

【實(shí)例1】將 echo 命令的輸出結(jié)果以追加的方式寫入到 demo.txt 文件中。

#!/bin/bash

for str in "C語(yǔ)言中文網(wǎng)" "http://c.biancheng.net/" "成立7年了" "日IP數(shù)萬(wàn)"
do
    echo $str >>demo.txt  #將輸入結(jié)果以追加的方式重定向到文件
done

運(yùn)行以上腳本,使用
cat demo.txt查看文件內(nèi)容,顯示如下:

C語(yǔ)言中文網(wǎng)

http://c.biancheng.net/

成立7年了

日IP數(shù)萬(wàn)

【實(shí)例2】將
ls -l命令的輸出結(jié)果重定向到文件中。

[c.biancheng.net]$ ls -l  #先預(yù)覽一下輸出結(jié)果
總用量 16
drwxr-xr-x. 2 root     root      21 7月   1 2016 abc
-rw-r--r--. 1 mozhiyan mozhiyan 399 3月  11 17:12 demo.sh
-rw-rw-r--. 1 mozhiyan mozhiyan  67 3月  22 17:16 demo.txt
-rw-rw-r--. 1 mozhiyan mozhiyan 278 3月  16 17:17 main.c
-rwxr-xr-x. 1 mozhiyan mozhiyan 187 3月  22 17:16 test.sh
[c.biancheng.net]$ ls -l >demo.txt  #重定向
[c.biancheng.net]$ cat demo.txt  #查看文件內(nèi)容
總用量 12
drwxr-xr-x. 2 root     root      21 7月   1 2016 abc
-rw-r--r--. 1 mozhiyan mozhiyan 399 3月  11 17:12 demo.sh
-rw-rw-r--. 1 mozhiyan mozhiyan   0 3月  22 17:21 demo.txt
-rw-rw-r--. 1 mozhiyan mozhiyan 278 3月  16 17:17 main.c
-rwxr-xr-x. 1 mozhiyan mozhiyan 187 3月  22 17:16 test.sh

錯(cuò)誤輸出重定向舉例

命令正確執(zhí)行是沒(méi)有錯(cuò)誤信息的,我們必須刻意地讓命令執(zhí)行出錯(cuò),如下所示:

[c.biancheng.net]$ ls java  #先預(yù)覽一下錯(cuò)誤信息
ls: 無(wú)法訪問(wèn)java: 沒(méi)有那個(gè)文件或目錄
[c.biancheng.net]$ ls java 2>err.log  #重定向
[c.biancheng.net]$ cat err.log  #查看文件
ls: 無(wú)法訪問(wèn)java: 沒(méi)有那個(gè)文件或目錄

正確輸出和錯(cuò)誤信息同時(shí)保存

【實(shí)例1】把正確結(jié)果和錯(cuò)誤信息都保存到一個(gè)文件中,例如:

[c.biancheng.net]$ ls -l >out.log 2>&1
[c.biancheng.net]$ ls java >>out.log 2>&1
[c.biancheng.net]$ cat out.log
總用量 12
drwxr-xr-x. 2 root     root      21 7月   1 2016 abc
-rw-r--r--. 1 mozhiyan mozhiyan 399 3月  11 17:12 demo.sh
-rw-rw-r--. 1 mozhiyan mozhiyan 278 3月  16 17:17 main.c
-rw-rw-r--. 1 mozhiyan mozhiyan   0 3月  22 17:39 out.log
-rwxr-xr-x. 1 mozhiyan mozhiyan 187 3月  22 17:16 test.sh
ls: 無(wú)法訪問(wèn)java: 沒(méi)有那個(gè)文件或目錄

out.log 的最后一行是錯(cuò)誤信息,其它行都是正確的輸出結(jié)果。

【實(shí)例2】上面的實(shí)例將正確結(jié)果和錯(cuò)誤信息都寫入同一個(gè)文件中,這樣會(huì)導(dǎo)致視覺(jué)上的混亂,不利于以后的檢索,所以我建議把正確結(jié)果和錯(cuò)誤信息分開(kāi)保存到不同的文件中,也即寫成下面的形式:

ls -l >>out.log 2>>err.log

這樣一來(lái),正確的輸出結(jié)果會(huì)寫入到 out.log,而錯(cuò)誤的信息則會(huì)寫入到 err.log。

/dev/null 文件

如果你既不想把命令的輸出結(jié)果保存到文件,也不想把命令的輸出結(jié)果顯示到屏幕上,干擾命令的執(zhí)行,那么可以把命令的所有結(jié)果重定向到 /dev/null 文件中。如下所示:

ls -l &>/dev/null

大家可以把 /dev/null 當(dāng)成 Linux 系統(tǒng)的垃圾箱,任何放入垃圾箱的數(shù)據(jù)都會(huì)被丟棄,不能恢復(fù)。

Linux Shell 輸入重定向

輸入重定向就是改變輸入的方向,不再使用鍵盤作為命令輸入的來(lái)源,而是使用文件作為命令的輸入。

表3:Bash 支持的輸出重定向符號(hào)
符號(hào) 說(shuō)明
command 將 file 文件中的內(nèi)容作為 command 的輸入。
command < 從標(biāo)準(zhǔn)輸入(鍵盤)中讀取數(shù)據(jù),直到遇見(jiàn)分界符 END 才停止(分界符可以是任意的字符串,用戶自己定義)。
command file2 將 file1 作為 command 的輸入,并將 command 的處理結(jié)果輸出到 file2。

和輸出重定向類似,輸入重定向的完整寫法是
fd,其中 fd 表示文件描述符,如果不寫,默認(rèn)為 0,也就是標(biāo)準(zhǔn)輸入文件。

輸入重定向舉例

【示例1】統(tǒng)計(jì)文檔中有多少行文字。

Linux wc 命令可以用來(lái)對(duì)文本進(jìn)行統(tǒng)計(jì),包括單詞個(gè)數(shù)、行數(shù)、字節(jié)數(shù),它的用法如下:

wc  [選項(xiàng)]  [文件名]

其中,
-c選項(xiàng)統(tǒng)計(jì)字節(jié)數(shù),
-w選項(xiàng)統(tǒng)計(jì)單詞數(shù),
-l選項(xiàng)統(tǒng)計(jì)行數(shù)。

統(tǒng)計(jì) readme.txt 文件中有多少行文本:

[c.biancheng.net]$ cat readme.txt  #預(yù)覽一下文件內(nèi)容
C語(yǔ)言中文網(wǎng)
http://c.biancheng.net/
成立7年了
日IP數(shù)萬(wàn)
[c.biancheng.net]$ wc -l 

【實(shí)例2】逐行讀取文件內(nèi)容。

#!/bin/bash

while read str; do
    echo $str
done 

運(yùn)行結(jié)果:

C語(yǔ)言中文網(wǎng)

http://c.biancheng.net/

成立7年了

日IP數(shù)萬(wàn)

這種寫法叫做代碼塊重定向,也就是把一組命令同時(shí)重定向到一個(gè)文件,我們將在《Shell代碼塊重定向》一節(jié)中詳細(xì)講解。

【實(shí)例3】統(tǒng)計(jì)用戶在終端輸入的文本的行數(shù)。

此處我們使用輸入重定向符號(hào)
<<,這個(gè)符號(hào)的作用是使用特定的分界符作為命令輸入的結(jié)束標(biāo)志,而不使用 Ctrl+D 鍵。

[c.biancheng.net]$ wc -l < 123
> 789
> abc
> xyz
> END
4

wc 命令會(huì)一直等待用輸入,直到遇見(jiàn)分界符 END 才結(jié)束讀取。

<<之后的分界符可以自由定義,只要再碰到相同的分界符,兩個(gè)分界符之間的內(nèi)容將作為命令的輸入(不包括分界符本身)。


文章標(biāo)題:LinuxShell重定向(輸入輸出重定向)精講
文章來(lái)源:http://www.5511xx.com/article/dppsghg.html