日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

如何理解Linux shell中的“2>1”(将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出))(尼玛>符号竟然不支持搜索,害我搜搜不到,只能搜)

發布時間:2025/3/20 linux 31 豆豆

文章目錄

    • 前言
    • 有何妙用
    • 如何理解
    • 總結

前言

有時候我們常看到類似這樣的腳本調用:

./test.sh > log.txt 2>&1

這里的2>&1是什么意思?該如何理解?
先說結論:上面的調用表明將./test.sh的輸出重定向到log.txt文件中,同時將標準錯誤也重定向到log.txt文件中。

有何妙用

(如果已經明白是什么作用,可跳過此小節)
上面到底是什么意思呢?我們來看下面的例子,假如有腳本test.sh:

#!/bin/bash date #打印當前時間 while true #死循環 do#每隔2秒打印一次sleep 2whatthis #不存在的命令echo -e "std output" done

腳本中先打印當前日期,然后每隔2秒執行whatthis并打印一段字符。由于系統中不存在whatthis命令,因此執行會報錯。
假如我們想保存該腳本的打印結果,只需將test.sh的結果重定向到log.txt中即可:

./test.sh > info.log

執行結果如下:

[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 #運行腳本 [root@RV1126_RV1109:/userdata/arnold_test]# ps -ef|grep test.sh #重新打開命令串口,使用ps命令找到test.sh的pid root 371 1679 0 14:46 pts/0 00:00:00 /bin/bash ./test.sh root 889 584 0 14:47 pts/1 00:00:00 grep 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(标准输出))(尼玛>符号竟然不支持搜索,害我搜搜不到,只能搜)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。