一. -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 這樣的寫法.
标準輸入,标準輸出與标準錯誤輸出
标準輸入:從鍵盤輸入,即從鍵盤讀入資料。
标準輸出:把資料輸出到終端上。
标準錯誤輸出:把标準錯誤輸出到終端上。
預設的标準輸入指的是鍵盤,預設的标準輸出與标準錯誤輸出是螢幕或者是終端。
系統為這三個檔案配置設定了檔案辨別符fd(file descripter).分别為0,1,2.
在Linux系統下,一切皆是檔案,對檔案的操作,一般要用到檔案辨別符。
重定向
重定向分為輸入重定向與輸出重定向。
"<"表示輸入重定向
">"表示輸出重定向
所謂的輸入重定向即輸入不從鍵盤讀入,而是從檔案輸入或其它。
所謂的輸出重定向即不輸出到終端上,而是輸出到檔案中去或其它。
"<<"代表目前标準輸入來自指令行的一對分隔号的中間内容。
用">"輸出時,如果檔案不存在會自動建立一個檔案,如果第二次輸入時,會覆寫前一次的輸入内容,
而">>"輸出,表示追加到檔案中,不覆寫。目前輸出内容會追加到指定檔案的尾部。
如:
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)輸入重定向
[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的檔案中去
其實,所謂的輸入輸出重定向就是不從鍵盤輸入和屏輸出。
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 進行重定向到一個輸出流才可以全部輸出到一個檔案