輸出
學過代碼的小伙伴應該知道STDIN、STDOUT、STDERR
通常都是指定輸出通道的,perl里又稱之為句柄
那么1代表的就是STDOUT、2代表的是STDERR、
jimmy在視頻中會翻譯成1代表的是正確輸出,2代表的是錯誤輸出。
其實嚴格上不能這樣去固有化去理解每一個軟件的定向輸出是正確還是錯誤,因為定義誰是正確輸出還是錯誤輸出,是寫軟件的人說的算呢,比如軟件運行中的日志信息,通常一般會定向到STROUT里,萬一有人會定向到錯誤輸出流呢
但是不管腫么樣,他都是軟件的日志信息,正確的提示日志也罷,錯誤的提示日志信息也罷,但凡提交到后臺的任務,如果運行異常,我們就必須查詢日志信息,這是任何一個運行任務或者前端端口必需學習的一個事情!因為有時候,即使運行沒錯,你也可能需要查詢一下日志信息才能確認真的是正確的!
反正說了這么多,保存日志信息就是很重要。怎么理解呢,運行下面兩句代碼
find / -name '*gz'
# 功能:找到存儲在這個服務器內所有gz結尾的文件
find / -name '*gz' 2>~/error.txt
避免屏幕上出現很多報錯信息,影響找到正確信息,如find: ‘/lost+found’: Permission denied,所以吧錯誤信息輸出到一個沒用的文本內
運行示例:
image.png
image.png
image.png
為什么有1和2
我是這樣理解的,通常一個程序有正確也有錯誤信息,但是我們有時候用>重定向符的時候會捕獲正確輸出,并且存到文本里面,但是如果錯誤輸出也輸入進去了,那么我們還要去用肉眼檢查嗎?如果文件很大的話,核查起來很困難的。再加上,我們希望報錯信息在提交任務的時候盡可能出現在屏幕上,讓我們能看到,因此正確和錯誤信息在計算機里確實是有兩個輸出流的~
1>log 2>&1
nohup ... &
這里的...是指你的代碼,或者一個.sh的文本,(如果不懂的話,請學習linux下任務提交以及如何后臺運行任務)
# ...是任務命令,一下是不同格式的理解
... 1>log1 2>log2 &
# 會生成兩個文本,一個是log1,一個是log2,
# 打開了兩個文件
... 1>log1 2>&1 &
# 會生成一個文本,1和2的輸出流都輸出到了log1里面
# 打開一次文件
... 1>log1 2>log1 &
# 錯誤用法,因為>重定向符號是打開文本前先清空,所以2在寫入文件的時候,會清空log1。會導致信息的丟失
不理解的直接做法
... 1>log1 2>&1 &
# 最佳做法,少存一個文本
# 為什么我不擔心正確信息會和錯誤信息存一起呢,那怎么辦
# 那是因為通常軟件的正確結果信息,已經被輸出到了一個文件內了,這里的1通常捕獲的是日志信息,比如gatk的日志信息,特別多,約每10s都有一行運行提示信息
結束
打字打到手指痛,好心疼我的手指,大家再會。有錯誤/問題,直接留言!!!