linux 重定向 2>&1 > >>
阿新 • • 發佈:2018-12-05
-
舉例
#cat test.sh [檢視test.sh 檔案] eat=("面呈牛王" "呷浦呷浦" "相當裡手" "十六味" "群生記") check=$[$RANDOM*10/32767+1] echo "your may eat ${eat[${check}]}" #cat test_error.sh [檢視test_error.sh 檔案] i am an error shell #cat log.txt [log.txt檔案] i am first line #sh test.sh [執行指令碼時會把輸出的結果輸出到螢幕] your may eat 喜家德水餃 #sh test_error.sh [執行指令碼時會把輸出的錯誤輸出到螢幕] test_error.sh: line 1: i: command not found #sh test.sh > log.txt [執行指令碼時會把輸出的結果輸出重定向到log.txt檔案 "覆蓋"原有的檔案內容] #cat log.txt your may eat 呷浦呷浦 #sh test.sh >> log.txt [執行指令碼時會把輸出的結果輸出重定向到log.txt檔案 "追加"原有的檔案內容] #cat log.txt your may eat 呷浦呷浦 your may eat 十六味 #sh test_error.sh >> log.txt test_error.sh: line 1: i: command not found [執行指令碼時不會把錯誤重定向到 log.txt檔案] #sh test_error.sh >> log.txt 2>&1 [執行指令碼時會把錯誤也重定向到log.txt檔案] #cat log.txt your may eat 呷浦呷浦 your may eat 十六味 test_error.sh: line 1: i: command not found
-
2>&1說明
很多人只知道這樣寫是把錯誤也重定向到制定檔案 但是卻並不知道為什麼是這麼寫 所以很多時候全靠背下來時間久了就忘記了 之前我就是這樣哈哈哈
其實每個程式在執行後,都會至少開啟三個檔案描述符,分別是0:標準輸入;1:標準輸出;2:標準錯誤。
我們在 test.sh 最後一行加上sleep 10#sh test.sh [執行] #ps -ef | grep test.sh [找到執行test.sh 程序的id 26222] makx 26222 24961 0 11:45 pts/13 00:00:00 sh test.sh makx 26336 25775 0 11:46 pts/23 00:00:00 grep --color=auto test.sh ll /proc/26222/fd [根據pid檢視程式開啟的檔案描述符] 總用量 0 lrwx------ 1 makx makx 64 12月 4 11:46 0 -> /dev/pts/13 lrwx------ 1 makx makx 64 12月 4 11:46 1 -> /dev/pts/13 lrwx------ 1 makx makx 64 12月 4 11:46 2 -> /dev/pts/13 lr-x------ 1 makx makx 64 12月 4 11:46 255 -> /home/makx/test.sh #sh test.sh > log.txt [執行] #ps -ef | grep test.sh [找到執行test.sh 程序的id 6437 ] makx 6437 2726 0 13:56 pts/9 00:00:00 sh test.sh makx 6440 2586 0 13:56 pts/7 00:00:00 grep --color=auto test.sh #ll /proc/6437/fd [根據pid檢視程式開啟的檔案描述符] 總用量 0 lrwx------ 1 makx makx 64 12月 4 13:56 0 -> /dev/pts/9 l-wx------ 1 makx makx 64 12月 4 13:56 1 -> /home/makx/log.txt lrwx------ 1 makx makx 64 12月 4 13:56 2 -> /dev/pts/9 lr-x------ 1 makx makx 64 12月 4 13:56 255 -> /home/makx/test.sh #sh test.sh > log.txt 2>&1 [執行] #ps -ef | grep test.sh [找到執行test.sh 程序的id 3159 ] makx 3159 2726 0 13:51 pts/9 00:00:00 sh test.sh makx 3323 2586 0 13:51 pts/7 00:00:00 grep --color=auto test.sh #ll /proc/3159/fd [根據pid檢視程式開啟的檔案描述符] 總用量 0 lrwx------ 1 makx makx 64 12月 4 13:51 0 -> /dev/pts/9 l-wx------ 1 makx makx 64 12月 4 13:51 1 -> /home/makx/log.txt l-wx------ 1 makx makx 64 12月 4 13:51 2 -> /home/makx/log.txt lr-x------ 1 makx makx 64 12月 4 13:51 255 -> /home/makx/test.sh
會發現 在加上> 或者>> 後文件描述符1指向了 /home/makx/log.txt ,在加上2>&1 之後 檔案描述符2 指向了1指向的地方也是 /home/makx/log.txt (不能用1是應為會把1當成普通檔案 &1指的不是普通檔案 而是檔案描述符) 現在明白了嗎 ?
其實linux裡好多命令都不需要硬背下來 找到其中的規律會覺得更有意思 哈哈 挺好玩的
參考
程式設計珠璣公眾號