Linux shell的標準輸入、輸出和錯誤
1.檔案描述符
在linux shell執行命令時,每個程序都和三個開啟的檔案相聯絡,並使用檔案描述符來引用這些檔案。由於檔案描述符不容易記憶,shell同時也給出了相應的檔名:
檔案 | 檔案描述符 |
輸入檔案—標準輸入 | 0(預設是鍵盤,為0時是檔案或者其他命令的輸出) |
輸出檔案—標準輸出 | 1(預設是螢幕,為1時是檔案) |
錯誤輸出檔案—標準錯誤 | 2(預設是螢幕,為2時是檔案) |
2.檔案重定向:改變程式執行的輸入來源和輸出地點
2.1.輸出重定向:
Command > filename | 把標準輸出重定向到一個新檔案中 |
Command >> filename | 把標準輸出重定向到一個檔案中(追加) |
Command > filename | 把標準輸出重定向到一個檔案中 |
Command > filename 2>&1 | 把標準輸出和錯誤一起重定向到一個檔案中 |
Command 2 > filename | 把標準錯誤重定向到一個檔案中 |
Command 2 >> filename | 把標準輸出重定向到一個檔案中(追加) |
Command >> filename2>&1 | 把標準輸出和錯誤一起重定向到一個檔案(追加) |
2.2.輸入重定向:
Command < filename > filename2 | Command命令以filename檔案作為標準輸入,以filename2檔案作為標準輸出 |
Command < filename | Command命令以filename檔案作為標準輸入 |
Command << delimiter | 從標準輸入中讀入,知道遇到delimiter分界符 |
2.3.繫結重定向
Command >&m | 把標準輸出重定向到檔案描述符m中 |
Command < &- | 關閉標準輸入 |
Command 0>&- | 同上 |
3.shell重定向的一些高階用法
3.1.重定向標準錯誤
例子1:
command 2> /dev/null
如果command執行出錯,將錯誤的資訊重定向到空裝置
例子2:
command > out.put 2>&1
將command執行的標準輸出和標準錯誤重定向到out.put(也就是說不管command執行正確還是錯誤,輸出都列印到out.put)。
3.2.exec用法
exec命令可以用來替代當前shell;換句話說,並沒有啟動子shell,使用這一條命令時任何現有環境變數將會被清除,並重新啟動一個shell(重新輸入使用者名稱和密碼進入)。
exec command
其中,command通常是一個shell指令碼。
對檔案描述符操作的時候用(也只有再這時候),它不會覆蓋你當前的shell
例子1:
#!/bin/bash
#file_desc
exec 3<&0 0<name.txt
read line1
read line2
exec 0<&3
echo $line1
echo $line2
其中:
首先,exec 3<&0 0<name.txt的意思是把標準輸入重定向到檔案描述符3(0表示標準輸入),然後把檔案name.txt內容重定向到檔案描述符0,實際上就是把檔案name.txt中的內容重定向到檔案描述符3。然後通過exec開啟檔案描述符3;
然後,通過read命令讀取name.txt的第一行內容line1,第二行內容line2,通過Exec 0<&3關閉檔案描述符3;
最後,用echo命令輸出line1和line2。最好在終端執行一下這個指令碼,親自嘗試一下。
例子2:
exec 3<>test.sh;
#開啟test.sh可讀寫操作,與檔案描述符3繫結
while read line<&3
do
echo $line;
done
#迴圈讀取檔案描述符3(讀取的是test.sh內容)
exec 3>&-
exec 3<&-
#關閉檔案的,輸入,輸出繫結
參考: