Linux 輸入、輸出、錯誤重定向(Aix系統同樣適用)



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)文件描述符與重定向符號之間不能有空格!

🌰

轉自:Linux標准/錯誤輸出重定向

標准輸出

$ 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標准輸入、輸出和錯誤和文件重定向 專題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM