如何理解Linux shell中的“2>1”(将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出))(尼玛>符号竟然不支持搜索,害我搜搜不到,只能搜)
文章目錄
- 前言
- 有何妙用
- 如何理解
- 總結
前言
有時候我們常看到類似這樣的腳本調用:
./test.sh > log.txt 2>&1這里的2>&1是什么意思?該如何理解?
先說結論:上面的調用表明將./test.sh的輸出重定向到log.txt文件中,同時將標準錯誤也重定向到log.txt文件中。
有何妙用
(如果已經明白是什么作用,可跳過此小節)
上面到底是什么意思呢?我們來看下面的例子,假如有腳本test.sh:
腳本中先打印當前日期,然后每隔2秒執行whatthis并打印一段字符。由于系統中不存在whatthis命令,因此執行會報錯。
假如我們想保存該腳本的打印結果,只需將test.sh的結果重定向到log.txt中即可:
執行結果如下:
[root@RV1126_RV1109:/userdata/arnold_test]# ./test.sh > info.log ./test.sh: line 7: whatthis: command not found ./test.sh: line 7: whatthis: command not found ./test.sh: line 7: whatthis: command not found ./test.sh: line 7: whatthis: command not found ./test.sh: line 7: whatthis: command not found ...我們明明將打印內容重定向到log.txt中了,但是這條錯誤信息卻沒有重定向到log.txt中。如果你是使用程序調用該腳本,當查看腳本日志的時候,將會完全看不到這條錯誤信息,只能看到打印的字符串。而使用下面的方式則會將出錯信息也重定向到log.txt中:
./test.sh > info.log 2>&1以這樣的方式調用腳本,可以很好的將錯誤信息保存,幫助我們定位問題。
info.log中的內容:
./test.sh: line 7: whatthis: command not found std output ./test.sh: line 7: whatthis: command not found std output ./test.sh: line 7: whatthis: command not found std output ./test.sh: line 7: whatthis: command not found std output如何理解
每個程序在運行后,都會至少打開三個文件描述符,分別是0:標準輸入;1:標準輸出;2:標準錯誤。
例如,對于前面的test.sh腳本,我們通過下面的步驟看到它至少打開了三個文件描述符:
可以看到test.sh的pid為371(這我還是用top命令看到的,不然都不知道哪個時pid),進入到相關fd目錄:
cd /proc/371/fd #進程5270所有打開的文件描述符信息都在此 [root@RV1126_RV1109:/proc/371/fd]# ls -l #列出目錄下的內容 total 0 lrwx------ 1 root root 64 Nov 12 15:00 0 -> /dev/pts/0 lrwx------ 1 root root 64 Nov 12 15:00 1 -> /dev/pts/0 lrwx------ 1 root root 64 Nov 12 15:00 2 -> /dev/pts/0 lr-x------ 1 root root 64 Nov 12 15:00 255 -> /userdata/arnold_test/test.sh可以看到,test.sh打開了0,1,2三個文件描述符。同樣的,如果有興趣,也可以查看其他運行進程的文件描述符打開情況,除非關閉了否則都會有這三個文件描述符。
那么現在就容易理解前面的疑問了,2>&1表明將文件描述2(標準錯誤輸出)的內容重定向到文件描述符1(標準輸出),為什么1前面需要&?當沒有&時,1會被認為是一個普通的文件,有&表示重定向的目標不是一個文件,而是一個文件描述符。在前面我們知道,test.sh >log.txt又將文件描述符1的內容重定向到了文件log.txt,那么最終標準錯誤也會重定向到log.txt。我們同樣通過前面的方法,可以看到test.sh進程的文件描述符情況如下:
操作如下:
[root@RV1126_RV1109:/userdata/arnold_test]# ./test.sh > info.log 2>&1 #運行腳本 [root@RV1126_RV1109:/proc/371/fd]# ps -ef|grep test.sh root 903 1679 0 15:06 pts/0 00:00:00 /bin/bash ./test.sh # 查看進程號為903 root 1597 584 0 15:08 pts/1 00:00:00 grep test.sh cd /proc/903/fd # 切換到903的fd(文件描述符)[root@RV1126_RV1109:/proc/903/fd]# ls -l # 查看文件描述符詳細信息 total 0 lrwx------ 1 root root 64 Nov 12 15:10 0 -> /dev/pts/0 l-wx------ 1 root root 64 Nov 12 15:10 1 -> /userdata/arnold_test/info.log l-wx------ 1 root root 64 Nov 12 15:10 2 -> /userdata/arnold_test/info.log lr-x------ 1 root root 64 Nov 12 15:10 255 -> /userdata/arnold_test/test.sh我們可以很明顯地看到,文件描述符1和2都指向了log.txt文件,也就得到了我們最終想要的效果:將標準錯誤輸出重定向到文件中。
它們還有兩種等價寫法:
./test.sh >& info.log ./test.sh &> info.log總結
我們總結一下前面的內容:
程序運行后會打開三個文件描述符,分別是標準輸入,標準輸出和標準錯誤輸出。 在調用腳本時,可使用2>&1來將標準錯誤輸出重定向。 只需要查看腳本的錯誤時,可將標準輸出重定向到文件,而標準錯誤會打印在控制臺,便于查看。 >>log.txt會將重定向內容追加到log.txt文件末尾。 通過查看/proc/進程id/fd下的內容,可了解進程打開的文件描述符信息。參考文章:如何理解Linux shell中的“2>&1”
總結
以上是生活随笔為你收集整理的如何理解Linux shell中的“2>1”(将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出))(尼玛>符号竟然不支持搜索,害我搜搜不到,只能搜)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux ubuntu kill指令和
- 下一篇: C++string类型与C语言字符数组的