在我們設定定時任務的時候經常會使用標準輸出和標準錯誤輸出。這個在linux是乙個非常重要的概念,而且這個很有用。程式應該有資料庫的**端、資料的目的端,以及報告問題的地方,它們被稱為標準輸入、標準輸出以及標準錯誤輸出。
程式啟動的時候,預設情況下,標準輸出、輸入都會已經開啟,且已準備好供其使用。我們使用xshell連線並登陸上伺服器的時候,預設下終端就是標準輸入、輸出端。可以試試cat命令。
$ cat重定向與管道#未指定任何的引數是,讀取預設的標準輸入、寫入到預設的標準輸出
建華是可以玩耍的小夥伴 #使用者輸入(此時終端預設是標準輸入)
建華是可以玩耍的小夥伴 #程式將內容輸出到標準輸出(此時終端預設為標準輸出)
^d #輸入ctrl-d 告訴程式檔案結尾
shell提供了數種語法,可以修改預設的io的**端和目的端,就是標準輸入和輸出的地方。
<
修改標準輸入
sort < ucid.txt
預設下,標準輸入為終端,此時可以更改為你想要的地方
<<
command << delimiter
從標準輸入中讀入,直到遇到delimiter分割符
>
修改標準輸出
ls -l > listinfo.txt
預設下,標準輸出為終端,此時可以修改預設輸出的地方。譬如可以將標準輸出的內容寫在檔案中。
如果檔案已存在,會被覆蓋掉。
>>
輸出附件到檔案
ls -l >> listinfo.txt
與[>]不一樣的是,[>]會清空原來的內容,而[>>]只是將標準輸出追加到檔案結尾處。
|建立管道
program1 | program2
1. program1的標準輸出為program2的標準輸入;
2. 管道的執行效率比使用臨時檔案的程式起碼高乙個數量級;
[
場景:對檔案內容的資訊進行排序
[nemo@name tool]$ cat[>]例子show.txt
7291418
2233803
8031001
1258962
[weiyg@name tool]$
sort
1258962
2233803
7291418
8031001
場景:列印內容到檔案
[weiyg@name script]$ ll在定時任務上面經常使用。因為定時任務執行的內容,不會列印到終端。如果需要檢視結果的話就很麻煩。而列印到檔案中的話,隨時都可以檢視了。不過這裡往往用[>>]追加比較多。total
20-rw-rw-r--. 1 weiyg weiyg 254 dec 31
13:45
ssh.rb
-rw-r--r--. 1 weiyg weiyg 476 dec 30
11:48
sshx.rb
-rw-rw-r--. 1 weiyg weiyg 12 dec 26
16:57
test.rb
[weiyg@name script]$
ls -l >listinfo.txt
[weiyg@name script]$
catlistinfo.txt
total
20-rw-rw-r--. 1 weiyg weiyg 0 jan 22
21:35
listinfo.txt
-rw-rw-r--. 1 weiyg weiyg 254 dec 31
13:45
ssh.rb
-rw-r--r--. 1 weiyg weiyg 476 dec 30
11:48
sshx.rb
-rw-rw-r--. 1 weiyg weiyg 12 dec 26
16:57 test.rb
[>>]例子
沒啥好說的,跟[>]就是乙個[>]會覆蓋原有的檔案,而[>>]只是追加。
[|]管道例子
場景:查詢id為19217***x的玩家在1月15日使用道具的日誌
[weiyg@name flash]$ bzcat *useprop.log.2014-01-15.bz2 |grep這是查詢遊戲日誌的乙個例子。預設下,系統會將遊戲5天前的日誌進行打包壓縮。而此時需要查詢5天前的日誌的話,使用上面的方法無論在效率上還是方便上,管道都有使用臨時檔案無法比擬的又是。當然使用下面的方法:'19217***x
'1389717003317|19217***x|2|304|305|0|
1389717005097|19217***x|2|303|304|0|
[weiyg@name flash]$ bzcat *useprop.log.2014-01-15.bz2 >tem.log也可以達到相同的結果,但相比使用管道,一、需要使用臨時檔案,讀寫在磁碟需要時間;二、臨時檔案還需要手動刪除,比較麻煩。[weiyg@name flash]$
grep
'19217***x
'tem.log
1389717003317|19217***x|2|304|305|0|
1389717005097|19217***x|2|303|304|0|
注:bzcat 可以直接顯示壓縮檔案的內容
特殊檔案:/dev/null 與/dev/tty
/dev/null 傳送到此檔案的資料都會被系統丟掉,,就是輸出到乙個空裝置的意思。
/dev/tty 程式開啟此檔案時,linux會自動將它重定向到乙個終端。
檔案描述符
在定時任務,我們經常在重定向的時候,喜歡這樣操作。
33後面的 2>&1是什麼意思呢,這裡就要理解檔案描述符和繫結重定向的概念了。 檔案1 * * * /home/weiyg/crontab/clear_logs.sh > /dev/null
2>&1
檔案描述符
輸入檔案——標準輸入
0(預設為終端(網上有說預設為鍵盤的))
輸出檔案——標準輸出
1(預設為終端)
錯誤輸出檔案——標準錯誤
2(預設為終端)
繫結重定向
commond >&m
標準輸出重定向到檔案描述符m中
command
關閉標準輸入
command 0>&-
關閉標準輸出
此時我們再去理解[2>&1],就容易多了。[2]是標準錯誤的檔案描述符,而[>&1]的意思重定向到標準輸出。那麼定時任務的解釋就是,將[clear_logs.sh]執行的標準輸出和標準錯誤重定向到[/dev/null](就是丟掉輸出的內容)。
我是這樣理解(不一定正確)上面的定時任務的(分2部分):
clear_logs.sh > /dev/null//-----------------------#將clear_logs.sh執行的標準輸出輸出到/dev/null
clear_logs.
sh2> /dev/null
#將clear_logs.sh執行的標準錯誤輸出到/dev/null,只是clear_logs.sh不是執行了2次,只是1次。這裡的&1代表的就是/dev/null
以上為本次學習i/o重定向的筆記。
參考資料:1. 《shell指令碼學習指南》arnold robbins & nelson h.f. beebe著 機械工業出版社
2. 《linux shell的標準輸入、輸出和錯誤 》
共勉之
Linux 基本I O重定向
在我們設定定時任務的時候經常會使用標準輸出和標準錯誤輸出。這個在linux是乙個非常重要的概念,而且這個很有用。程式應該有資料庫的 端 資料的目的端,以及報告問題的地方,它們被稱為標準輸入 標準輸出以及標準錯誤輸出。程式啟動的時候,預設情況下,標準輸出 輸入都會已經開啟,且已準備好供其使用。我們使用...
Linux標準I O和重定向
執行乙個shell命令時,通常會自動開啟三個標準檔案,即標準輸入檔案 stdin 檔案描述符為0,通常對應終端的鍵盤 標準輸出檔案 stdout 檔案描述符為1和標準錯誤輸出檔案 stderr 檔案描述符為2,這兩個檔案都對應終端的螢幕。標準i o和重定向 ls,命令列讀取執行鍵盤敲擊的文字流 ls...
linux中的IO重定向
資料匯流排 傳輸資料 控制中心 控制指令 暫存器 cup暫時儲存器 i o 輸入輸出裝置 i o重定向 管道 前乙個命令的輸出,作為後乙個命令的輸入 命令1 命令2 命令3 練習 統計 usr bin 目錄下的檔案個數 ls usr bin wc l 取出當前系統所有使用者的shell,要求 每種s...