Linux下Shell標準輸入 輸出和錯誤

2021-10-04 20:35:52 字數 4139 閱讀 2301

大多數 unix、linux 作業系統命令從你的終端接受輸入並將所產生的輸出傳送回到您的終端。乙個命令通常從乙個叫標準輸入的地方讀取輸入,預設情況下,這恰好是你的終端。同樣,乙個命令通常將其輸出寫入到標準輸出,預設情況下,這也是你的終端。

檔案描述符

描述對映關係

0標準輸入,鍵盤

/dev/stdin -> /proc/self/fd/0

1標準輸出,螢幕

/dev/stdout -> /proc/self/fd/1

2標準錯誤,螢幕

/dev/stderr -> /proc/self/fd/2

符號描述

>

符號左邊輸出作為右邊輸入(標準輸出)

>>

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

<

符號右邊輸出作為左邊輸入(標準輸入)

<<

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

&重定向繫結符號

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

shell命令是從左到右依次執行命令。

下面n字母是檔案描述符。

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

一般格式:[n]

如果n沒有指定,預設是0

示例:

a.txt內容作為grep輸入:

[root@ chenc01 ~]

# grep "test" --color < a.txt

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

123abc

eof123

abc[root@ chenc01 ~]

# cat > a.txt << eof

\> 123

\> abc

\> eof

/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

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 $

a b c

遇到e字元返回:

[root@ chenc01 ~]

# read -d e var

123456

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

123abc

分別變數賦值:

[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

linux中的標準輸入 標準輸出 標準錯誤

在shell中執行命令時,每個程序都和三個開啟的檔案相聯絡,並使用檔案描述符來引用這些檔案。輸入檔案 標準輸入 0 預設是鍵盤輸入,也可以是檔案或其他命令的輸出 輸出檔案 標準輸出 1 預設是螢幕,也可以是檔案 錯誤輸出檔案 標準錯誤 2 預設是螢幕,也可以是檔案 linux系統中實際上有12個檔案...

Linux下的標準輸入,輸出,重定向,管道

linux系統中,有4個特殊符號 在我們處理輸入和輸出時存在重要但具有迷惑性的作用 bin bash echo i am std output 下面是隨筆寫的乙個理論上不存在的命令,會報錯 unexisted command 輸出 i am std output stdout error.sh 行 ...

Linux標準輸入 標準輸出和標準錯誤重定向

shell會自動為我們開啟和關閉0 1 2這三個檔案描述符,我們不需要顯式地開啟或關閉它們。標準輸入是命令的輸入,預設指向鍵盤 標準輸出是命令的輸出,預設指向螢幕 標準錯誤是命令錯誤資訊的輸出,預設指向螢幕。標準輸入是檔案描述符0。它是命令的輸入,預設是鍵盤,也可以是檔案或其他命令的輸出。標準輸出是...