Linux I

標準文件描述符

Linux 中一切皆文件,其中輸入輸出進程也被視為文件。Linux中通過文件描述符(file descriptor) 來標識文件對象。出於特殊的管理目的,Linux 保留了前三個文件描述符作為標準輸入輸出及標準錯誤。

Linux I/O 高級控制

重定向錯誤

將錯誤信息重定向到指定文件,命令舉例:

ls -al not_exist_file 2> error_file # 2代表 STDERR 標準錯誤信息,並重定向到error_file中

注:2和重定向符號之間不能有空格。這裡只是重定向輸出標準錯誤,也可以同時重定向STDOUT & STDERR, 需要分別調用重定向,例如

ls -al not_exist_file exist_file 2>errfile 1>outfile

該命令將錯誤信息和標準輸出信息分別打印到不同的文件,有利於日誌分析。

ls -al not_exist_file exist_file &>outfile;

該命令通過特殊重定向符 '&>' 將STDERR & STDOUT 都重定向到outfile中。

在腳本中重定向輸出

1. 臨時重定向:在腳本中,可以自定義錯誤信息並使之重定向到STDERR,格式為

echo "error information" >&2 # &2 將信息重定向到STDERR

2. 永久重定向:通過exec 命令實現腳本執行期間的重定向到某個文件描述符

exec 1> testout #重定向 STDOUT 到 testout 文件

少廢話,上例子:

Linux I/O 高級控制

執行腳本及輸出:

Linux I/O 高級控制

在腳本中重定向輸入

exec 0< testfile #將testfile內容作為輸入

關閉文件描述符

文件描述符會在腳本退出時自動關閉,如果想在腳本結束前關閉,需要手動關閉。格式為:

exec 3>&- #關閉文件描述符3

關閉文件描述符後,不能再向該文件描述重定向內容了。

消息垃圾桶

有時在運行腳本時,我們不希望消息打印到屏幕上,尤其是一些後臺運行的腳本,也不關心不重要的錯誤信息,此時可以通過將消息重定向到 '/dev/null'文件中,null 文件不會記錄任何東西,工作原理就像一個垃圾桶,任何重定向到該文件的消息都會被丟棄。舉例:

ls -al > /dev/null

創建臨時文件

有時我們需要將信息存儲到臨時文件,Linux 默認創建目錄/tmp 存儲臨時文件,可以通過命令“mktemp" 在該目錄下創建臨時文件。該命令在文件末尾生成隨機字符來區分文件。

mktemp testfile.XXXXXX

當然我們也可以自定義臨時文件目錄,通過命令

mktemp -d dir.XXXXXX

原理與創建臨時文件相同,只是通過 -d 參數來實現創建目錄。創建了臨時目錄和臨時文件後,就可以通過重定向文件描述符到臨時文件。

實戰案例

本節講了文件重定向的問題,但是很多夥伴可能並不清楚它具體有什麼用。紙上談兵終覺淺,下面我們就以實際案例來總結重定向的用法。我們從一個csv文件中讀取用戶信息,然後將用戶信息組成sql語句存入數據庫腳本文件中,向數據庫插入數據。

# info.csv
Chales,22,Male
Lliu,33,Female

腳本文件

Linux I/O 高級控制

腳本中,讀取csv 文件,IFS 設置成 ',' 來分解數據,將 csv 文件中的信息按照name, age, sex 讀取,組織成sql 語句,最終輸出文件重定向到 'my.sql' 文件。

調用腳本:

./my_script info.csv

檢查輸出結果:

Linux I/O 高級控制

至此一個完整的文件重定向案例講完了,實際工作中我們經常會用到重定向來處理和分析問題。所以夥伴們可以多加練習熟練掌握。


分享到:


相關文章: