shell中將輸入、輸出和錯誤用三種描述符表示:
- 標(biāo)準(zhǔn)輸入
STDIN,用0表示,接受鍵盤輸入
使用cat命令接受鍵盤輸入 - 非標(biāo)準(zhǔn)輸入-文件輸入,即使用
cat讀取文件 - 標(biāo)準(zhǔn)輸出
STDOUT,對應(yīng)終端顯示,1表示 - 標(biāo)準(zhǔn)錯誤
STDERR,2表示
??Demo1:重定向輸出到文件中
ls -l顯示文件的信息
>>追加內(nèi)容
>替換內(nèi)容
who命令打印當(dāng)前登錄的系統(tǒng)用戶信息
ls -l hello.sh
cat hello.sh
#追加內(nèi)容
who>>hello.sh
cat hello.sh
??Demo2:重定向錯誤信息輸出到文件中
-al查找文件
?錯誤做法:
ls -al hello.sh > aim.sh
上面執(zhí)行后,如果沒有aim.sh文件,則會自動創(chuàng)建aim.sh文件,但是最終都不會將錯誤信息輸出到目標(biāo)文件aim.sh中
所以如果我們需要保存錯誤信息,就需要采用STDERR實現(xiàn)
?正確做法:
將STDERR文件描述修改為2
ls -al a.sh 2>hello.sh
??Demo3:同時保存錯誤和數(shù)據(jù)到不同文件
#將錯誤數(shù)據(jù)重定向到error.sh文件中,將查找結(jié)果保存到hello.sh文件中
ls -al a.sh b.sh c.sh 2>error.sh >hello.sh
??Demo4:同時保存錯誤和數(shù)據(jù)到同一個文件
使用命令符&>
ls -a file.sh &>result.sh
#查看文件內(nèi)容
cat result.sh
臨時重定向輸出:
&命令
#將輸出信息作為錯位日志
echo "haha" >& 2
執(zhí)行:將STDERR信息重定向到error.sh文件中
./hello.sh 2>error.sh
永久重定向輸出:
exec命令
保存數(shù)據(jù):
#在文件內(nèi)部
exec 1 > new.sh
echo "haha"
重定向輸入:
命令符<
一旦設(shè)置了輸入重定向指令,則read指令會自動連接輸入的內(nèi)容
#從hello.sh文件中讀取數(shù)據(jù)
exec 0< hello.sh
count=0
while read line
do
echo "當(dāng)前行的內(nèi)容數(shù)據(jù)是:$line,當(dāng)前行數(shù):$count"
count=$[$count + 1]
done
自定義重定向輸出:
使用exec命令
??下面這種方式,會替換掉要定向文件里面的所有內(nèi)容:
exec 3> hello.sh
#臨時重定向,標(biāo)記文件
echo "haha" >&3
??如果在要定向的文件中追加內(nèi)容,而不是替換:
exec 3 >> hello.sh
#臨時重定向,標(biāo)記文件
echo "haha" >&3
重定向輸出恢復(fù):
#將3重定向為1
exec 3 >& 1
exec 1> hello.sh
echo "haha"
#將1恢復(fù)到3
exec 1 >& 3
echo "xixi"
創(chuàng)建讀寫文件描述符:
exec 3<>hello.sh
#從hello文件中讀取內(nèi)容
read line >&3
echo "$line"
#寫入內(nèi)容
echo "hah" >& 3
#注意:此寫入會替換掉從第二行開始的所有內(nèi)容
#因為上面讀取完第一行后,此時文件指針指向到了第二行
關(guān)閉讀寫文件描述符:
exec 3 >&-
阻止命令輸出:
輸出到系統(tǒng)一個臨時文件中,但是此臨時文件不會保存內(nèi)容
ls -al > /dev/null
使用阻止輸出來清空文件:
cat /dev/null > hello.sh