ps:好吧我承認因為這篇是東拼西湊的,轉載的話,不知道填寫哪位大神的,所以暫且無恥的定為原創,不過文末加了轉載連接
背景
執行完linux命令之后,希望將標准輸出和錯誤輸出分別重定向到不同的文件,否則在同一個文件的話,后期代碼中不好處理,所以需要了解下知識背景。
文件文件描述符
系統中實際上有12個文件描述符,但是正如我們在上表中所看到的, 0、1、2是標准輸入、輸出和錯誤。可以任意使用文件描述符3到9。
標准輸入是文件描述符0。它是命令的輸入,缺省是鍵盤,也可以是文件或其他命令的輸出。
標准輸出是文件描述符1。它是命令的輸出,缺省是屏幕,也可以是文件。
標准錯誤是文件描述符2。這是命令錯誤的輸出,缺省是屏幕,同樣也可以是文件。
輸入重定向
主要用於改變命令的輸入源,讓輸入不要來自鍵盤,而來自指定文件。基本用法:
命令 < 文件名
$ ls < ls.out
輸出重定向
主要用於改變命令的輸出,讓標准輸出不要顯示在屏幕上,而是寫入到指定文件中。基本用法:
命令 > 文件名
$ ls > ls.out
以上是對標准輸出來講的,至於標准錯誤輸出的重定向,只需要換一種符號,將 > 改為 2> ,將 >> 改為 2>>。將標准輸出和標准錯誤輸出重定向到同一文件,則使用符號 &>。
錯誤重定向
為了重定向標准錯誤,可以指定文件描述符2。
grep命令沒有找到該文件,缺省地向終端輸出了一個錯誤信息。現在讓我們把錯誤重定向到文件/dev/null中(實際就上是系統的垃圾箱):
$ grep “trident” missiles 2>/dev/null
這樣所有的錯誤輸出都輸送到了/dev/null,不再出現在屏幕上。
合並標准輸出和標准錯誤
在合並標准輸出和標准錯誤的時候,切記shell是從左至右分析相應的命令的。下面給出一個例子:
$ cleanup >cleanup.out 2>&1
在上面的例子中,我們將cleanup 腳本的輸出重定向到>cleanup.out文件中,而且其錯誤也被重定向到相同的文件中。
$ grep “standard”* > grep.out 2>&1
在上面的例子中,grep命令的標准輸出和標准錯誤都被重定向到grep.out文件中。你在使出前面提到的“此處”文擋時,有可能需要把所有的輸出都保存到一個文件中,這樣萬一出現了錯誤,就能夠被記錄下來。通過使用2 > & 1就可以做到這一點
& 表示等同於的意思,2>&1,表示2的輸出重定向等同於1,即和1重定向的文件系統上的位置是一樣的
規律
重定向的使用有如下規律:
1)標准輸入0、輸出1、錯誤2需要分別重定向,一個重定向只能改變它們中的一個。
2)標准輸入0和標准輸出1可以省略。(當其出現重定向符號左側時)
3)文件描述符在重定向符號左側時直接寫即可,在右側時前面加& 【類似於指針前要加*號,來區分這、兩種情況】。
4)文件描述符與重定向符號之間不能有空格!
🌰
標准輸出
$ df -h >file
(base) pc@pc-System-Product-Name:/project/raw_fq$ cat file1
Filesystem Size Used Avail Use% Mounted on
udev 32G 0 32G 0% /dev
tmpfs 6.3G 2.4M 6.3G 1% /run
/dev/nvme0n1p2 228G 11G 207G 5% /
tmpfs 32G 0 32G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/loop0 13M 13M 0 100% /snap/gnome-characters/139
/dev/loop2 2.3M 2.3M 0 100% /snap/gnome-calculator/260
/dev/loop1 36M 36M 0 100% /snap/gtk-common-themes/1198
/dev/loop4 152M 152M 0 100% /snap/gnome-3-28-1804/36
/dev/loop3 141M 141M 0 100% /snap/gnome-3-26-1604/82
/dev/loop5 141M 141M 0 100% /snap/gnome-3-26-1604/74
/dev/loop6 3.8M 3.8M 0 100% /snap/gnome-system-monitor/57
/dev/loop7 4.2M 4.2M 0 100% /snap/gnome-calculator/406
/dev/loop8 1.0M 1.0M 0 100% /snap/gnome-logs/61
/dev/loop9 90M 90M 0 100% /snap/core/6673
/dev/loop10 15M 15M 0 100% /snap/gnome-logs/45
/dev/nvme0n1p1 511M 6.1M 505M 2% /boot/efi
/dev/loop11 35M 35M 0 100% /snap/gtk-common-themes/818
/dev/loop12 91M 91M 0 100% /snap/core/6350
/dev/loop13 15M 15M 0 100% /snap/gnome-characters/254
/dev/loop14 54M 54M 0 100% /snap/core18/941
/dev/loop15 3.8M 3.8M 0 100% /snap/gnome-system-monitor/77
/dev/sda1 7.3T 5.3T 1.6T 78% /data
/dev/sdb1 7.3T 93M 6.9T 1% /public
/dev/sdd1 7.3T 572M 6.9T 1% /home
/dev/sdc1 7.3T 173G 6.7T 3% /project
tmpfs 6.3G 16K 6.3G 1% /run/user/121
tmpfs 6.3G 36K 6.3G 1% /run/user/1000
/dev/loop16 90M 90M 0 100% /snap/core/6818
/dev/loop17 15M 15M 0 100% /snap/gnome-characters/258
/dev/loop18 3.8M 3.8M 0 100% /snap/gnome-system-monitor/81
/dev/loop19 152M 152M 0 100% /snap/gnome-3-28-1804/40
$ df -h > file1
$ diff file1 file
28c28
< /dev/sdc1 7.3T 173G 6.7T 3% /project
---
> /dev/sdc1 7.3T 163G 6.7T 3% /project
標准輸出和錯誤輸出分別放兩個文件
$ ls /error test >right_file 2>wrong_file
$ cat right_file
test:
hangshu.tex
result.txt
text.txt
$ cat wrong_file
ls: cannot access '/error': No such file or directory
錯誤和正確的放一個文件
$ ls /error test >all.log 2>&1
$ cat all.log
ls: cannot access '/error': No such file or directory
test:
hangshu.tex
result.txt
text.txt
或者簡單寫為
ls /error test &>all2.log
$ cat all2.log
ls: cannot access '/error': No such file or directory
test:
hangshu.tex
result.txt
text.txt
參考的文檔:
Linux標准/錯誤輸出重定向
Linux命令行使用之命令行輸入與輸出
Linux標准輸入、輸出和錯誤和文件重定向 專題