Shell 標(biāo)準(zhǔn)輸入、輸出和錯誤

2018-06-08 17:08 更新

防偽碼:桃花潭水深千尺,不及汪倫送我情。

文件描述符(fd):文件描述符是一個非負(fù)整數(shù),在打開現(xiàn)存文件或新建文件時,內(nèi)核會返回一個

文件描述符,讀寫文件也需要使用文件描述符來訪問文件。

內(nèi)核為每個進程維護該進程打開的文件記錄表。文件描述符只適于 Unix、Linux 操作系統(tǒng)。

8. 1  標(biāo)準(zhǔn)輸入、輸出和錯誤

文件描述符  描述  映射關(guān)系

0  標(biāo)準(zhǔn)輸入,鍵盤  /dev/stdin -> /proc/self/fd/0

1  標(biāo)準(zhǔn)輸出,屏幕  /dev/stdout -> /proc/self/fd/1

2  標(biāo)準(zhǔn)錯誤,屏幕  /dev/stderr -> /proc/self/fd/2

8.2  重定向符號

符號  描述

>  符號左邊輸出作為右邊輸入(標(biāo)準(zhǔn)輸出)

>>  符號左邊輸出追加右邊輸入

<  符號右邊輸出作為左邊輸入(標(biāo)準(zhǔn)輸入)

<<  符號右邊輸出追加左邊輸入

&  重定向綁定符號

輸入和輸出可以被重定向符號解釋到 shell。

shell 命令是從左到右依次執(zhí)行命令。

下面 n 字母是文件描述符。

8.3  重定向 輸出

1)覆蓋輸出

一般格式:[n]>word

如果 n 沒有指定,默認(rèn)是 1

示例:

打印結(jié)果寫到文件:echo "test" > a.txt

當(dāng)沒有安裝 bc 計算器時,錯誤輸出結(jié)果寫到文件:echo "1 + 1" |bc 2> error.log

2)追加重定向輸出

一般格式:[n]>>word

如果 n 沒有指定,默認(rèn)是 1

示例:

打印結(jié)果追加到文件:echo "test" >> a.txt

當(dāng)沒有安裝 bc 計算器時,錯誤輸出結(jié)果追加文件:echo "1 + 1" |bc 2> error.log

8.4 4 重定向輸入

一般格式:[n]<word

如果 n 沒有指定,默認(rèn)是 0

示例:

a.txt 內(nèi)容作為 grep 輸入:grep "test" --color < a.txt

8.5 5 重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤

1)覆蓋重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤

兩種格式重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤:

&>word 和>&word 等價于>word 2>&1

&將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)輸入綁定到一起,重定向 word 文件。

示例:

當(dāng)不確定執(zhí)行對錯時都覆蓋到文件:echo "1 + 1" |bc &> error.log

當(dāng)不確定執(zhí)行對錯時都覆蓋到文件:echo "1 + 1" |bc > error.log 2>&1

2)追加標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤

追加格式:&>>word 等價于>>word 2>&1

當(dāng)不確定執(zhí)行對錯時都追加文件:echo "1 + 1" |bc &>> error.log

將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)標(biāo)準(zhǔn)輸入追加重定向到 word:

<<[-]word

here-document

delimiter

從當(dāng)前 shell 讀取輸入源,直到遇到一行只包含 delimiter 終止,內(nèi)容作為標(biāo)準(zhǔn)輸入。

將 eof 標(biāo)準(zhǔn)輸入作為 cat 標(biāo)準(zhǔn)輸出再寫到 a.txt:

# cat <<eof

123

abc

eof

123

abc

# cat > a.txt << eof

> 123

> abc

> eof

8.6  重定向到 空設(shè)備

/dev/null 是一個空設(shè)備,向它寫入的數(shù)組都會丟棄,但返回狀態(tài)是成功的。與其對應(yīng)的還有一個

/dev/zero 設(shè)備,提供無限的 0 數(shù)據(jù)流。

在寫 Shell 腳本時我們經(jīng)常會用到/dev/null 設(shè)備,將 stdout、stderr 輸出給它,也就是我們不想

要這些輸出的數(shù)據(jù)。

通過重定向到/dev/null 忽略輸出,比如我們沒有安裝 bc 計算器,正常會拋出沒有發(fā)現(xiàn)命令:

# echo "1 + 1" |bc >/dev/null 2>&1

這就讓標(biāo)準(zhǔn)和錯誤輸出到了空設(shè)備。

忽略標(biāo)準(zhǔn)輸出:

# echo "test" >/dev/null

忽略錯誤輸出:

# echo "1 + 1" |bc 2>/dev/null

d 8.7 read  命令

read 命令從標(biāo)準(zhǔn)輸入讀取,并把輸入的內(nèi)容復(fù)制給變量。

命令格式: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p

prompt] [-t timeout] [-u fd] [name ...]

-e  在一個交互 shell 中使用 readline 獲取行

-r  不允許反斜杠轉(zhuǎn)義任何字符

-s  隱藏輸入

-a array  保存為數(shù)組,元素以空格分隔

-d delimiter  持續(xù)讀取直到遇到 delimiter 第一個字符退出

-i text  將 test 文本作為

-n nchars  讀取 nchars 個字符返回,而不是等到換行符

-N nchars  讀取 nchars 個字符返回,除非遇到文件結(jié)束符或超時,其他分隔符都被忽略

-p prompt  提示信息

-t timeout  等待超時時間,秒

-u fd  指定文件描述符號碼作為輸入,默認(rèn)是 0

name  變量名

示例:

獲取用戶輸入保存到變量:

# read -p "Please input your name: " VAR

Please input your name: lizhenliang

# echo $VAR

lizhenliang

用戶輸入保存為數(shù)組:

# read -p "Please input your name: " -a ARRAY

Please input your name: a b c

# echo ${ARRAY[*]}

a b c

遇到 e 字符返回:

# read -d e VAR

123

456

e

# echo $VAR

123 456

從文件作為 read 標(biāo)準(zhǔn)輸入:

# cat a.txt

adfasfd

# read VAR < a.txt

# echo $VAR

adfasfd

while 循環(huán)讀取每一行作為 read 的標(biāo)準(zhǔn)輸入:

# cat a.txt |while read LINE; do echo $LINE; done

123

abc

分別變量賦值:

# read a b c

1 2 3

# echo $a

1

# echo $b

2

# echo $c

3

# echo 1 2 3 | while read a b c;do echo "$a $b $c"; done

1 2 3

謝謝觀看,真心的希望能幫到您!

本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號