linux 檔案重定向
阿新 • • 發佈:2019-02-09
我們通過只前的部落格對檔案io有了一定的瞭解。在今天我們說的檔案重定向。就要求我們對檔案有一定的瞭解。具體檔案io看部落格:系統檔案呼叫io操作介面
什麼是檔案重定向
標準輸入輸出重定向:是指將原來從標準輸入讀取資料的檔案操作重新定向為從向其他檔案讀取資料;將原來要輸出到標準輸出的內容,從新定向輸出到指定的其他檔案中。
舉個比方:這個貼著1 的盒子原來放糖果用,後來你不想放糖果了,把糖果倒了出來,改放曲奇餅乾了。
標準輸出重定向命令
< //標準輸入重定向
> //標準輸出重定向 清空原先的內容後新增新的內容
>> //標準輸出重定向 在原來內容換行下方新增新的內容
舉個例下:
//echo "hello world" >> ./test.txt
將原先輸出到顯示器的資料改輸入到text.txt檔案中
./test.exe 2 > &1 >./test.txt
//首先每個檔案都有檔案描述符我們在只前見過,詳細連結見文章開頭
//stdin 標準輸入 0;stdout 標準輸出 1;sterr 標準錯誤輸出 2
//將錯誤資訊(2)從定向到標準輸出(1),將標準輸出(1)重定向到檔案(id)
//結果是:錯誤資訊顯示在顯示屏,標註輸出列印的內容寫入到檔案中。
n >& m 表示:將輸出檔案 m 和 n 合併,而且n重定向到m。
n <& m 表示:將輸入檔案 m 和 n 合併,而且n重定向到m。
./test.exe >./test.txt 2>&1
//將錯誤資訊(2)重定向到檔案(id),將標準輸出(1)重定向到錯誤資訊(此時錯誤資訊已經重定向改成了檔案的id)
//結果:將錯誤資訊和標準輸出列印的內容都寫入檔案中了。
檔案重定向實質
我們已經知道,每個檔案都有其對應的檔案識別符號,而檔案的識別符號實際上就是管理檔案的結構體的陣列的下標,而且是優先使用下標數值較小的下標值(檔案描述符)。
那麼對檔案輸入輸出的重定向,就是改變對應的檔案下標的指向,改變其指向的檔案描述資訊。
對檔案描述符的複製,就是複製的該下標的指標。
程式碼中如何重定向
#include<unistd.h>
int dup(int oldfd);
//複製oldfd的檔案描述符
//舉個例子:fd=dup(1); 表述向fd所指的檔案描述符代表檔案中寫入資料,實際就是向標準輸出(1)寫入資料。則結果:寫入資料會被列印到螢幕。
int dup2(int oldfd,int newfd);
//將newfd描述符從指向原本的檔案,重新修改指向指向到oldfd所指向的檔案去。
//如果newfd原先有指向的檔案,那麼那個檔案將會被關閉。close(fd);會被系統呼叫
/dev/null 檔案
如果希望執行某個命令,但又不希望在螢幕上顯示輸出結果,那麼可以將標準輸出(1)重定向到檔案: /dev/null ;
//例子:
./test.exe >/dev/null 2
//結果知道把螢幕上比顯示錯誤資訊。這可是自欺欺人哦,一般還是不要這樣做的好哦。哈哈。
/dev/null是一個特殊的檔案,寫入到它的內容想到與被丟棄,像極了windows的回收站,可是如果我們從null找檔案可是什麼都趙不到的哦。
而dev則是Linux核心的裝置管理器。具體參見部落格linux根目錄下各個目錄的詳細介紹