linux在你登入時,便將默認的標准輸入、標准輸出、標准錯誤輸出安排成你的終端。I/O重定向就是你通過與終端交互,或者在shell script裡設置,重新安排從哪裡輸入或者輸出到哪裡。每個程序都應該有標准輸入/輸出(錯誤輸出)。
重定向的方法大抵有:>、<、<<、管道等
先了解stdin、stdout、stderr。
標准輸出(stdout):代碼為1,使用>或者>>,是命令執行所回傳的正確的信息。
1>:以覆蓋的方法將正確的數據輸出到指定的文件或者設備上
1>>:以追加的方法將正確的數據輸出到指定的文件或者設備上
標准錯誤輸出(stderr):代碼為2,使用2>或2>>,是命令執行失敗後,所回傳的錯誤信息。
2>:以覆蓋的方法將錯誤的數據輸出到指定的文件或者設備上
2>>:以追加的方法將錯誤的數據輸出到指定的文件或者設備上
- [root@localhost ~]# cat /etc/crontab /etc/thinksay
- SHELL=/bin/bash
- PATH=/sbin:/bin:/usr/sbin:/usr/bin
- MAILTO=root
- HOME=/
-
- # run-parts
- 01 * * * * root run-parts /etc/cron.hourly
- 02 4 * * * root run-parts /etc/cron.daily
- 22 4 * * 0 root run-parts /etc/cron.weekly
- 42 4 1 * * root run-parts /etc/cron.monthly
- cat: /etc/thinksay: 沒有那個文件或目錄
- [root@localhost ~]# cat /etc/crontab /etc/thinksay > list_right 2> list_error
- [root@localhost ~]# cat list_error
- cat: /etc/thinksay: 沒有那個文件或目錄
- [root@localhost ~]# cat list_right
- SHELL=/bin/bash
- PATH=/sbin:/bin:/usr/sbin:/usr/bin
- MAILTO=root
- HOME=/
-
- # run-parts
- 01 * * * * root run-parts /etc/cron.hourly
- 02 4 * * * root run-parts /etc/cron.daily
- 22 4 * * 0 root run-parts /etc/cron.weekly
- 42 4 1 * * root run-parts /etc/cron.monthly
標准輸入(stdin):代碼為0,使用<或<<,是將原本需要由鍵盤輸入的數據改由文件內容來替代。注意,<<代表的是結束輸入的意思。
- [root@localhost think]# cat > test <<"eof"
- > my name is think
- > hello world
- > eof
- [root@localhost think]# cat test
- my name is think
- hello world
可以把>、<、>>想象成漏斗:數據會從大的一端進入,由小的一端出來。
>重定向符在目的文件不存在時,會新建一個。然而,目的文件已存在,它就會被覆蓋掉,原本的數據都會丟失。而>>在目的文件不存在時,會新建一個;存在時會追加到文件尾。
管道可以把兩個以上執行中的程序鏈接在一起,第一個程序的標准輸出可以變成第二個程序的標准輸入。因為,>或者<使用的是臨時文件,管道在速度上比臨時文件快上10倍。從最原始的數據開始,然後構造一條條管道,一步步地,管道中的每個階段都會讓數據更接近要的結果。請記得,構造管道時,應該試著讓每個階段的數據量變得更少。
- [root@localhost think]# cat > test01 << "eof"
- > 1 2 5
- > eof
- [root@localhost think]# tr -d 2 < test01 | sort > test02
- [root@localhost think]# cat test02
- 1 5
有個特殊文件,便是大家耳熟能詳的”位桶“--/dev/null。重定向到此文件的數據都會被系統丟掉。
最後介紹一下,什麼時候重定向?
運用場景:
1)屏幕輸出信息很重要,而且我們需要將其存下時
2)後台執行中的程序,不希望它打攪屏幕正常的輸出結果時
3)一些系統的例行工作,希望它可以存下來時
4)一些執行命令的可能已知錯誤信息,想以“2> /dev/null"將其丟棄時
5)錯誤信息與正確信息需要分別執行時