如何理解Linux shell中的“2>1”(将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出))(尼玛>符号竟然不支持搜索,害我搜搜不到,只能搜)
文章目錄
- 前言
- 有何妙用
- 如何理解
- 總結(jié)
前言
有時(shí)候我們常看到類似這樣的腳本調(diào)用:
./test.sh > log.txt 2>&1這里的2>&1是什么意思?該如何理解?
先說(shuō)結(jié)論:上面的調(diào)用表明將./test.sh的輸出重定向到log.txt文件中,同時(shí)將標(biāo)準(zhǔn)錯(cuò)誤也重定向到log.txt文件中。
有何妙用
(如果已經(jīng)明白是什么作用,可跳過(guò)此小節(jié))
上面到底是什么意思呢?我們來(lái)看下面的例子,假如有腳本test.sh:
腳本中先打印當(dāng)前日期,然后每隔2秒執(zhí)行whatthis并打印一段字符。由于系統(tǒng)中不存在whatthis命令,因此執(zhí)行會(huì)報(bào)錯(cuò)。
假如我們想保存該腳本的打印結(jié)果,只需將test.sh的結(jié)果重定向到log.txt中即可:
執(zhí)行結(jié)果如下:
[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 ...我們明明將打印內(nèi)容重定向到log.txt中了,但是這條錯(cuò)誤信息卻沒(méi)有重定向到log.txt中。如果你是使用程序調(diào)用該腳本,當(dāng)查看腳本日志的時(shí)候,將會(huì)完全看不到這條錯(cuò)誤信息,只能看到打印的字符串。而使用下面的方式則會(huì)將出錯(cuò)信息也重定向到log.txt中:
./test.sh > info.log 2>&1以這樣的方式調(diào)用腳本,可以很好的將錯(cuò)誤信息保存,幫助我們定位問(wèn)題。
info.log中的內(nèi)容:
./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如何理解
每個(gè)程序在運(yùn)行后,都會(huì)至少打開(kāi)三個(gè)文件描述符,分別是0:標(biāo)準(zhǔn)輸入;1:標(biāo)準(zhǔn)輸出;2:標(biāo)準(zhǔn)錯(cuò)誤。
例如,對(duì)于前面的test.sh腳本,我們通過(guò)下面的步驟看到它至少打開(kāi)了三個(gè)文件描述符:
可以看到test.sh的pid為371(這我還是用top命令看到的,不然都不知道哪個(gè)時(shí)pid),進(jìn)入到相關(guān)fd目錄:
cd /proc/371/fd #進(jìn)程5270所有打開(kāi)的文件描述符信息都在此 [root@RV1126_RV1109:/proc/371/fd]# ls -l #列出目錄下的內(nèi)容 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打開(kāi)了0,1,2三個(gè)文件描述符。同樣的,如果有興趣,也可以查看其他運(yùn)行進(jìn)程的文件描述符打開(kāi)情況,除非關(guān)閉了否則都會(huì)有這三個(gè)文件描述符。
那么現(xiàn)在就容易理解前面的疑問(wèn)了,2>&1表明將文件描述2(標(biāo)準(zhǔn)錯(cuò)誤輸出)的內(nèi)容重定向到文件描述符1(標(biāo)準(zhǔn)輸出),為什么1前面需要&?當(dāng)沒(méi)有&時(shí),1會(huì)被認(rèn)為是一個(gè)普通的文件,有&表示重定向的目標(biāo)不是一個(gè)文件,而是一個(gè)文件描述符。在前面我們知道,test.sh >log.txt又將文件描述符1的內(nèi)容重定向到了文件log.txt,那么最終標(biāo)準(zhǔn)錯(cuò)誤也會(huì)重定向到log.txt。我們同樣通過(guò)前面的方法,可以看到test.sh進(jìn)程的文件描述符情況如下:
操作如下:
[root@RV1126_RV1109:/userdata/arnold_test]# ./test.sh > info.log 2>&1 #運(yùn)行腳本 [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 # 查看進(jìn)程號(hào)為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 # 查看文件描述符詳細(xì)信息 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文件,也就得到了我們最終想要的效果:將標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到文件中。
它們還有兩種等價(jià)寫(xiě)法:
./test.sh >& info.log ./test.sh &> info.log總結(jié)
我們總結(jié)一下前面的內(nèi)容:
程序運(yùn)行后會(huì)打開(kāi)三個(gè)文件描述符,分別是標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出。 在調(diào)用腳本時(shí),可使用2>&1來(lái)將標(biāo)準(zhǔn)錯(cuò)誤輸出重定向。 只需要查看腳本的錯(cuò)誤時(shí),可將標(biāo)準(zhǔn)輸出重定向到文件,而標(biāo)準(zhǔn)錯(cuò)誤會(huì)打印在控制臺(tái),便于查看。 >>log.txt會(huì)將重定向內(nèi)容追加到log.txt文件末尾。 通過(guò)查看/proc/進(jìn)程id/fd下的內(nèi)容,可了解進(jìn)程打開(kāi)的文件描述符信息。參考文章:如何理解Linux shell中的“2>&1”
總結(jié)
以上是生活随笔為你收集整理的如何理解Linux shell中的“2>1”(将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出))(尼玛>符号竟然不支持搜索,害我搜搜不到,只能搜)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux ubuntu kill指令和
- 下一篇: Linux 用户空间和内核空间指的是什么