shell重定向(大於號,小於號,左右,2>&1,&)

一. -e表示只要filename存在,則爲真,不管filename是什麼類型,當然這裏加了!就取反
額外的一些
-e filename 如果 filename存在,則爲真
-d filename 如果 filename爲目錄,則爲真
-f filename 如果 filename爲常規文件,則爲真
-L filename 如果 filename爲符號鏈接,則爲真
-r filename 如果 filename可讀,則爲真
-w filename 如果 filename可寫,則爲真
-x filename 如果 filename可執行,則爲真
-s filename 如果文件長度不爲0,則爲真
-h filename 如果文件是軟鏈接,則爲真

二.shell重定向(大於號,小於號,左右,2>&1,&)

shell重定向(大於號,小於號,左右,2>&1,&)
Linux的IO輸入輸出有三類

Standard Input 代碼 0
Standard Output 代碼 1
Standard Error 代碼 2

舉個例子:ls test.sh test1.sh >success.txt 2>&1

將前面執行結果的標準輸出流寫入success.txt文件,省略了1,全句爲:ls test.sh test1.sh 1>success.txt 2>&1。

錯誤輸出用2,如2>error.txt。用&1表示類似1,和1綁定到一起,輸出到一個文件,用&表示綁定在一起。而“&-”表示關閉。

但注意,

command > file 2>file 與command > file 2>&1 是不同的:

command > file 2>file :是將命令所產生的標準輸出信息stdout和錯誤的輸出信息stderr送到file中,但這樣會導致file會被打開兩次,所以stdout和stderr會互相覆蓋。實際上FD1和FD2同時使用file,引起資源競爭。
而command >file 2>&1:將stdout直接送向file,而stderr是繼承FD1管道後被送往file,所以file 只被打開一次,stdout和stderr共用FD1一個管道。實際相當於stderr合併到stdout後一起輸出到file中。
從IO效率上,前一條命令的效率要比後面一條的命令效率要低,所以在編寫shell腳本的時候,較多的時候我們會用command > file 2>&1 這樣的寫法.

  1. 標準輸入,標準輸出與標準錯誤輸出

標準輸入:從鍵盤輸入,即從鍵盤讀入數據。

標準輸出:把數據輸出到終端上。

標準錯誤輸出:把標準錯誤輸出到終端上。

默認的標準輸入指的是鍵盤,默認的標準輸出與標準錯誤輸出是屏幕或者是終端。

系統爲這三個文件分配了文件標識符fd(file descripter).分別爲0,1,2.

在Linux系統下,一切皆是文件,對文件的操作,一般要用到文件標識符。

  1. 重定向

重定向分爲輸入重定向與輸出重定向。

"<"表示輸入重定向

">"表示輸出重定向

所謂的輸入重定向即輸入不從鍵盤讀入,而是從文件輸入或其它。

所謂的輸出重定向即不輸出到終端上,而是輸出到文件中去或其它。

"<<"代表當前標準輸入來自命令行的一對分隔號的中間內容。

用">"輸出時,如果文件不存在會自動建立一個文件,如果第二次輸入時,會覆蓋前一次的輸入內容,

而">>"輸出,表示追加到文件中,不覆蓋。當前輸出內容會追加到指定文件的尾部。

如:

python historical_report.py 2014 06 age | >log_sex_age.txt 2>&1

python historical_report.py 2014 06 age | >>log_sex_age.txt 2>&1

這裏注意“|”兩邊的空格可有可無。>會覆蓋原文件,>>只追加到文件尾。

  1. 下面看一下幾個例子

(1)輸入重定向

[root@localhost ~]# wc</etc/inittab
53 229 1666

wc統計行數,單詞數, 字符數

其中wc的輸入來自 /etc/inittab

[root@localhost ~]# wc <<aa

1
11
111
aa
3 3 9

wc統計分隔符aa之間的內容。

(2)輸出重定向

[root@localhost ~]# ps -ef >a.txt //把進程的信息輸出重定向到a.txt文件中去

[root@localhost ~]# ps -ef> >a.txt //進程信息追加到a.txt的文件中去

其實,所謂的輸入輸出重定向就是不從鍵盤輸入和屏輸出。

  1. Linux下輸出重定向的典型分析

(1) a.out > outfile 2>&1
(2) a.out 2> &1 >outfile

分析:

0 代表標準輸入,1代表標準輸出,2代表標準錯誤輸出。其中1(即>=1>)可省略,默認爲標準輸出。所以輸出一般省略1,如cat "test" 1>log 2>eorr ,簡寫成,cat "test" >log 2>eorr。

(1)首先 把a.out重定向到outfile中。然後 2>&1把標準錯誤輸出重定向和1一樣的文件中去。相當於把標準輸出與標準錯誤輸出都一起重定向到outfile中去。 &1代表的是標準輸出的文件描述符。1一般放在左邊表示標準輸出重定向到什麼位置,而1放在右邊是重定向到標準輸出中,所以用&區分一 下,表示標準輸出的文件描述符。2>1表示把標準錯誤重定向到文件1中去,2>&1則表示標準錯誤重定向到標準輸出中去。

(2)首先把標準錯誤輸出重定向到標準輸出中,此時標準輸出還在終端。因此標準錯誤也在終端。然後標準輸出到outfile中去了。而標準錯誤還是在終端。

因此,(1)表示標準輸出與標準錯誤都到outfile中去了。

(2)表示標準輸出到outfile,但標準錯誤輸出仍然在終端。

ls 1>/dev/null 2>/dev/null

ls >/dev/null 2>&1

/dev/null是一個垃圾箱,是一個無底洞,表示的含義爲不顯示。

即標準輸出與標準錯誤輸出不顯示。

以上兩個命令表示的含義是相同的。

另外,&>表示全部重定向:ls thereisno &> out.txt 所有IO重定向(&>中的&可以代表任意,0,1,2,3……)

區別:command >/dev/null 2>&1 與command 2>&1 >/dev/null

前者先將標準輸出輸出到/dev/null中,再將錯誤輸出重定向到標準輸出,所以都輸出到/dev/null

後者先將錯誤輸出重定向到標準輸出也就是輸出到屏幕上,再將標準輸出到/dev/null,只是把原來的標準輸出輸出到/de/null中,錯誤輸出重定向到標準輸出會顯示在屏幕上;

標準輸出與錯誤輸出同時輸出:command 2>file 1>file 會因搶佔file文件的管道二出現亂碼/確實/覆蓋等現象(即兩個輸出流操作一個文件的寫入),所以要用2>&1 進行重定向到一個輸出流纔可以全部輸出到一個文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章