第八章 Shell標準輸入 輸出和錯誤

2021-09-05 08:23:40 字數 3504 閱讀 2072

檔案描述符(fd):檔案描述符是乙個非負整數,在開啟現存盤案或新建檔案時,核心會返回乙個檔案描述符,讀寫檔案也需要使用檔案描述符來訪問檔案。

核心為每個程序維護該程序開啟的檔案記錄表。檔案描述符只適於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

示例:列印結果寫到檔案:echo "test" > a.txt

當沒有安裝bc計算器時,錯誤輸出結果寫到檔案:echo "1 + 1" |bc2 > error.log

2)追加重定向輸出

一般格式:[n]>>word

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

示例:列印結果追加到檔案:echo "test" >> a.txt

當沒有安裝bc計算器時,錯誤輸出結果追加檔案:echo "1 + 1" |bc2 > error.log

一般格式:[n]

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

示例:a.txt內容作為grep輸入:grep "test" --color < a.txt   

1)覆蓋重定向標準輸出和標準錯誤

兩種格式重定向標準輸出和標準錯誤:

&>word和》&word 等價於 >word 2>&1  

&將標準輸出和標準輸入繫結到一起,重定向word檔案。

示例:當不確定執行對錯時都覆蓋到檔案:echo "1 + 1" |bc &> error.log

當不確定執行對錯時都覆蓋到檔案:echo "1 + 1" |bc > error.log 2>&1

2)追加標準輸出和標準錯誤

追加格式:&>>word  等價於》word2>&1

當不確定執行對錯時都追加檔案:echo "1 + 1" |bc &>> error.log

將標準輸出和標準標準輸入追加重定向到word:

<<[-]word

here-document

delimiter

從當前shell讀取輸入源,直到遇到一行只包含delimiter終止,內容作為標準輸入。

將eof標準輸入作為cat標準輸出再寫到a.txt:

# cat << eof

123abc

eof 

123abc

# cat > a.txt << eof

> 123

> abc

> eof

/dev/null是乙個空裝置,向它寫入的陣列都會丟棄,但返回狀態是成功的。與其對應的還有乙個/dev/zero裝置,提供無限的0資料流。

在寫shell指令碼時我們經常會用到/dev/null裝置,將stdout、stderr輸出給它,也就是我們不想要這些輸出的資料。

通過重定向到/dev/null忽略輸出,比如我們沒有安裝bc計算器,正常會丟擲沒有發現命令:

# echo "1 + 1" |bc >/dev/null 2>&1
這就讓標準和錯誤輸出到了空裝置。

忽略標準輸出:

# echo "test" >/dev/null
忽略錯誤輸出:

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

qq群:323779636(shell/python運維開發群)

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第乙個字元退出

-i text

將test文字作為

-n nchars

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

-n nchars

讀取nchars個字元返回,除非遇到檔案結束符或超時,其他分隔符都被忽略

-p prompt

提示資訊

-t timeout

等待超時時間,秒

-u fd

指定檔案描述符號碼作為輸入,預設是0

name

變數名 示例:

獲取使用者輸入儲存到變數:

# read -p "please input your name:" var

please input your name: lizhenliang

# echo $var

lizhenliang

使用者輸入儲存為陣列:

# read -p "please input your name:" -a array

please input your name: a b c

# echo $

a b c

遇到e字元返回:

# read -d e var

123456

e# echo $var

123 456

從檔案作為read標準輸入:

# cat a.txt

adfasfd

# read var < a.txt

# echo $var

adfasfd

while迴圈讀取每一行作為read的標準輸入:

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

123abc

分別變數賦值:

# 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

高階C語言第八章 字元輸入 輸出和輸入驗證

getchar 和putchar 每次只處理乙個字元 緩衝區無緩衝輸入 輸入字元立即列印 緩衝輸入 按enter鍵之前不會重複列印剛輸入的字元 字元被收集並儲存在乙個被稱為緩衝區的臨時區域,按enter鍵後,程式才能使用使用者輸入的字元 完全緩衝 當緩衝區域被填滿時才重新整理緩衝區域。檔案輸入中 行...

第八章 指標 第八章 指標

1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...

第八章(筆記)

能在 中進行記憶體單元的定址的暫存器只有4個,分別是bx si di bp 其中bx bp 是基址,bx對應的段位址是ds,bp對應的段位址是ss si di 是變址,單獨使用時段位址是ds,組合使用段位址是跟隨組合的基址對應的段位址 中進行記憶體單元定址彙總 si di bx bp 常量 si 常...