1.文件描述符
在linux shell執(zhí)行命令時,每個進程都和三個打開的文件相聯(lián)系,并使用文件描述符來引用這些文件。由于文件描述符不容易記憶,shell同時也給出了相應(yīng)的文件名:
文件 |
文件描述符 |
輸入文件—標準輸入 |
0(缺省是鍵盤,為0時是文件或者其他命令的輸出) |
輸出文件—標準輸出 |
1(缺省是屏幕,為1時是文件) |
錯誤輸出文件—標準錯誤 |
2(缺省是屏幕,為2時是文件) |
系統(tǒng)中實際上有12個文件描述符,我們可以任意使用文件描述符3到9.
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 < &- |
關(guān)閉標準輸入 |
Command 0>&- |
同上 |
3.shell重定向的一些高級用法
3.1.重定向標準錯誤
例子1:
command 2> /dev/null
如果command執(zhí)行出錯,將錯誤的信息重定向到空設(shè)備
例子2:
command > out.put 2>&1
將command執(zhí)行的標準輸出和標準錯誤重定向到out.put(也就是說不管command執(zhí)行正確還是錯誤,輸出都打印到out.put)。
3.2.exec用法
exec命令可以用來替代當前shell;換句話說,并沒有啟動子shell,使用這一條命令時任何現(xiàn)有環(huán)境變量將會被清除,并重新啟動一個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內(nèi)容重定向到文件描述符0,實際上就是把文件name.txt中的內(nèi)容重定向到文件描述符3。然后通過exec打開文件描述符3;
然后,通過read命令讀取name.txt的第一行內(nèi)容line1,第二行內(nèi)容line2,通過Exec 0<&3關(guān)閉文件描述符3;
最后,用echo命令輸出line1和line2。最好在終端運行一下這個腳本,親自嘗試一下。
例子2:
exec 3<>test.sh;
#打開test.sh可讀寫操作,與文件描述符3綁定
while read line<&3
do
echo $line;
done
#循環(huán)讀取文件描述符3(讀取的是test.sh內(nèi)容)
exec 3>&-
exec 3<&-
#關(guān)閉文件的,輸入,輸出綁定
參考:
http://zqwt.012.blog.163.com/blog/static/1204468420103272857116/
http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html
http://blog.csdn.net/flowingflying/article/details/5201199
|