防偽碼:桃花潭水深千尺,不及汪倫送我情。
文件描述符(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)載!
更多建議: