Shell標準輸入、輸出和錯誤
大多數 Unix、Linux 操作系統命令從你的終端接受輸入並將所產生的輸出發送回到您的終端。一個命令通常從一個叫標準輸入的地方讀取輸入,默認情況下,這恰好是你的終端。同樣,一個命令通常將其輸出寫入到標準輸出,默認情況下,這也是你的終端。
1、標準輸入、輸出和錯誤
文件描述符 | 描述 | 映射關係 |
---|---|---|
0 | 標準輸入,鍵盤 | /dev/stdin -> /proc/self/fd/0 |
1 | 標準輸出,屏幕 | /dev/stdout -> /proc/self/fd/1 |
2 | 標準錯誤,屏幕 | /dev/stderr -> /proc/self/fd/2 |
2、重定向符號
符號 | 描述 |
---|---|
> | 符號左邊輸出作爲右邊輸入(標準輸出) |
>> | 符號左邊輸出追加右邊輸入 |
< | 符號右邊輸出作爲左邊輸入(標準輸入) |
<< | 符號右邊輸出追加左邊輸入 |
& | 重定向綁定符號 |
輸入和輸出可以被重定向符號解釋到shell。
shell命令是從左到右依次執行命令。
下面n字母是文件描述符。
3、重定向輸出
1)覆蓋輸出
一般格式:[n]>word
如果n沒有指定,默認是1
示例:
打印結果寫到文件:
[root@ chenc01 ~]# echo "test" > a.txt
當沒有安裝bc計算器時,錯誤輸出結果寫到文件:
[root@ chenc01 ~]# echo "1 + 1" |bc 2 > error.log
2)追加重定向輸出
一般格式:[n]>>word
如果n沒有指定,默認是1
示例:
打印結果追加到文件:
[root@ chenc01 ~]# echo "test" >> a.txt
當沒有安裝bc計算器時,錯誤輸出結果追加文件:
[root@ chenc01 ~]# echo "1 + 1" |bc 2 > error.log
4、重定向輸入
一般格式:[n]<word
如果n沒有指定,默認是0
示例:
a.txt內容作爲grep輸入:
[root@ chenc01 ~]# grep "test" --color < a.txt
5、重定向標準輸出和標準錯誤
1)覆蓋重定向標準輸出和標準錯誤
&>word和>&word 等價於 >word 2>&1
&將標準輸出和標準輸入綁定到一起,重定向word文件。
示例:
當不確定執行對錯時都覆蓋到文件:
[root@ chenc01 ~]# echo "1 + 1" |bc &> error.log
當不確定執行對錯時都覆蓋到文件:
[root@ chenc01 ~]# echo "1 + 1" |bc > error.log 2>&1
2)追加重定向標準輸出和標準錯誤
&>>word 等價於>>word 2>&1
示例:
當不確定執行對錯時都追加文件:
[root@ chenc01 ~]# echo "1 + 1" |bc &>> error.log
將標準輸出和標準輸入追加重定向到delimiter:
<< delimiter
here-document
delimiter
從當前shell讀取輸入源,直到遇到一行只包含delimiter終止,內容作爲標準輸入。
將eof標準輸入作爲cat標準輸出再寫到a.txt:
[root@ chenc01 ~]# cat << eof
123
abc
eof
123
abc
[root@ chenc01 ~]# cat > a.txt << eof
\> 123
\> abc
\> eof
6、重定向到空設備
/dev/null是一個空設備,向它寫入的數組都會丟棄,但返回狀態是成功的。與其對應的還有一個/dev/zero設備,提供無限的0數據流。
在寫Shell腳本時我們經常會用到/dev/null設備,將stdout、stderr輸出給它,也就是我們不想要這些輸出的數據。
通過重定向到/dev/null忽略輸出,比如我們沒有安裝bc計算器,正常會拋出沒有發現命令:
[root@ chenc01 ~]# echo "1 + 1" |bc >/dev/null 2>&1
這就讓標準和錯誤輸出到了空設備。
忽略標準輸出:
[root@ chenc01 ~]# echo "test" >/dev/null
忽略錯誤輸出:
[root@ chenc01 ~]# echo "1 + 1" |bc 2>/dev/null
7、read命令
read命令從標準輸入讀取,並把輸入的內容複製給變量。
命令格式: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name …]
-e | 在一個交互shell中使用readline獲取行 |
---|---|
-r | 不允許反斜槓轉義任何字符 |
-s | 隱藏輸入 |
-a array | 保存爲數組,元素以空格分隔 |
-d delimiter | 持續讀取直到遇到delimiter第一個字符退出 |
-n nchars | 讀取nchars個字符返回,而不是等到換行符 |
-p prompt | 提示信息 |
-t timeout | 等待超時時間,秒 |
-u fd | 指定文件描述符號碼作爲輸入,默認是0 |
name | 變量名 |
示例:
獲取用戶輸入保存到變量:
[root@ chenc01 ~]# read -p "Please input your name: " VAR
Please input your name: lizhenliang
[root@ chenc01 ~]# echo $VAR
lizhenliang
用戶輸入保存爲數組:
[root@ chenc01 ~]# read -p "Please input your name: " -a ARRAY
Please input your name: a b c
[root@ chenc01 ~]# echo ${ARRAY[*]}
a b c
遇到e字符返回:
[root@ chenc01 ~]# read -d e VAR
123
456
e
[root@ chenc01 ~]# echo $VAR
123 456
從文件作爲read標準輸入:
[root@ chenc01 ~]# cat a.txt
adfasfd
[root@ chenc01 ~]# read VAR < a.txt
[root@ chenc01 ~]# echo $VAR
adfasfd
while循環讀取每一行作爲read的標準輸入:
[root@ chenc01 ~]# cat a.txt |while read LINE; do echo $LINE; done
123
abc
分別變量賦值:
[root@ chenc01 ~]# read a b c
1 2 3
[root@ chenc01 ~]# echo $a
1
[root@ chenc01 ~]# echo $b
2
[root@ chenc01 ~]# echo $c
3
[root@ chenc01 ~]# echo 1 2 3 | while read a b c;do echo "$a $b $c"; done
1 2 3