標籤:linux shell.>> &>
一、檔案代碼
“轉向”的意思是說:原本應由標準輸入(如鍵盤)讀取資料的,改由其它檔案讀取;原本應把結果顯示在標準輸出(如螢幕)的,改輸出到其它檔案。在這個過程中會涉及到檔案代碼(file descriptor)的概念。
所謂檔案代碼,是指作業系統賦予已開啟檔案一個編號(由0開始),作為追蹤檔案之用,如對這個檔案進行讀取或寫入的操作,都使用檔案代碼來溝通。下邊檔案代碼數字用fd來表示。
作業系統預設3個檔案代碼:0 標準輸入、1 標準輸出、2 標準錯誤
這3個檔案在建立Shell環境時已開啟,往後如果開啟新檔案,則分配2以上的號碼。
< 代錶轉向輸入,如果< 左邊省略檔案代碼,則預設為0,指的就是標準輸入。
> 代錶轉向輸出,如果> 左邊省略檔案代碼,則預設為1,指的就是標準輸出。
這些轉向文法大部分不能單獨使用,必須跟Bash的命令一起運用,如exec、ls、read等,是屬於指令結構的一部分。
本篇中的fd、n、m代表檔案代碼
#echo ’hello,world!‘ > a.txt#exec 7<>a.txt#cat <&7hello,world!
二、操作檔案
這裡要說明的"操作檔案",是指運用轉向的概念,開啟檔案、複製檔案代碼和關閉檔案。
1、開啟檔案
文法:fd<>檔案
用途:開啟檔案,指定代碼為fd。使用這種方式開啟的檔案,可供讀寫。
用例:exec 6<>test.txt
使用exec執行轉向,開啟檔案test.txt,並指定其代碼檔案為6
2、關閉檔案
開啟檔案後,如果該檔案不再使用,最好關閉檔案,交回調用檔案代碼所佔用的系統資源。這是一個很好的習慣。
關閉轉向輸入檔案
文法:fd<&-
用例:6<&-
關閉轉向輸出檔案
文法:fd>&-
用例:exec 5>&-
3、複製檔案代碼,建立檔案連結
作業系統已開啟的檔案代碼(0、1、2),為了不影響原有檔案代碼的作用,最好先複製一份,等操作結束再還原回去,稱“複製代碼”。
兩種方式:
a、複製轉向輸入的檔案代碼m,存檔案代碼n,使n串連至m n<&m
b、複製轉向輸出的檔案代碼m,存成檔案代碼n,使n串連至m n>&m
用例:
exec >&6 等同於exec 1>&6,將標準輸出串連到檔案代碼6,因此,凡是出現在標準輸出的內容,會轉存至檔案代碼6
cat <&6 等同於cat 0<&6,將檔案代碼6的內容,轉向至標準輸入,而由cat把內容顯示出來。
exec 5<&0 複製標準輸入(0),存成檔案代碼5,即建立檔案代碼0的串連,簡單說就是做標準輸入的備份。
exec 0<&5 5<&- 將儲存在檔案代碼5的標準輸入還原,並關閉檔案代碼5。
三、轉向的用法
代碼要緊鄰符號,轉向輸入輸出預設只能使用一次。
1、轉向輸入
文法:fd<檔案
用途:使用"檔案"作為輸入,指定它的檔案代碼為fd
用例:
wc -l < /etc/passwd #<左方省略fd,預設fd為0,指的就是標準輸入轉向:
exec 6< /etc/passwd #<左方檔案代碼不空;
wc -l <&6 #當一次輸入斷行符號的時候,會輸出passwd行數,再按一次斷行符號則為空白
2、轉向輸出
文法:fd>檔案
用途:使用檔案做輸出,指定檔案代碼為fd
如果檔案不存在,會建立,如果存在,會清空。可以關閉檔案預設操作set -o noclobber或set -C
用例:
>test.txt(建立空檔案) #>左方的省略fd,fd預設為1
:>test.txt #效果同上
ls > dirs.txt #儲存命令執行的輸出
exec 6> out.txt #開啟檔案out.txt作為輸出
echo ‘hello world!‘ 1>&6 #將echo輸出的內容儲存在檔案代碼6
fd>|檔案 同fd>檔案 但fd>|不理會noclobber選項,會強制覆蓋、清空。
>|不管noclobber選項是否啟用,只要檔案存在,該內容一定會被清空。
3、轉向附加
文法:fd>>檔案
用途:使用方法同 fd>檔案, 只是fd>>不會覆蓋、不會清空,只是追加。
4、標準錯誤伴隨標準輸出做轉向
文法:&>檔案 或 >&檔案 效果一樣。
‘>檔案 2>&1‘和 &>作用一樣。
本文出自 “Welcome To Linux World” 部落格,請務必保留此出處http://linuxnote.blog.51cto.com/9876511/1641252
Linux Shell之八 轉向的用法