歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

shell編程:數據流重定向

linux在你登入時,便將默認的標准輸入、標准輸出、標准錯誤輸出安排成你的終端。I/O重定向就是你通過與終端交互,或者在shell script裡設置,重新安排從哪裡輸入或者輸出到哪裡。每個程序都應該有標准輸入/輸出(錯誤輸出)。

重定向的方法大抵有:>、<、<<、管道等

先了解stdin、stdout、stderr。

標准輸出(stdout):代碼為1,使用>或者>>,是命令執行所回傳的正確的信息。

1>:以覆蓋的方法將正確的數據輸出到指定的文件或者設備上

1>>:以追加的方法將正確的數據輸出到指定的文件或者設備上

標准錯誤輸出(stderr):代碼為2,使用2>或2>>,是命令執行失敗後,所回傳的錯誤信息。

2>:以覆蓋的方法將錯誤的數據輸出到指定的文件或者設備上

2>>:以追加的方法將錯誤的數據輸出到指定的文件或者設備上

  1. [root@localhost ~]# cat /etc/crontab /etc/thinksay  
  2. SHELL=/bin/bash  
  3. PATH=/sbin:/bin:/usr/sbin:/usr/bin  
  4. MAILTO=root  
  5. HOME=/  
  6.   
  7. # run-parts  
  8. 01 * * * * root run-parts /etc/cron.hourly  
  9. 02 4 * * * root run-parts /etc/cron.daily  
  10. 22 4 * * 0 root run-parts /etc/cron.weekly  
  11. 42 4 1 * * root run-parts /etc/cron.monthly  
  12. cat: /etc/thinksay: 沒有那個文件或目錄  
  13. [root@localhost ~]# cat /etc/crontab /etc/thinksay > list_right 2> list_error  
  14. [root@localhost ~]# cat list_error  
  15. cat: /etc/thinksay: 沒有那個文件或目錄  
  16. [root@localhost ~]# cat list_right  
  17. SHELL=/bin/bash  
  18. PATH=/sbin:/bin:/usr/sbin:/usr/bin  
  19. MAILTO=root  
  20. HOME=/  
  21.   
  22. # run-parts  
  23. 01 * * * * root run-parts /etc/cron.hourly  
  24. 02 4 * * * root run-parts /etc/cron.daily  
  25. 22 4 * * 0 root run-parts /etc/cron.weekly  
  26. 42 4 1 * * root run-parts /etc/cron.monthly  

標准輸入(stdin):代碼為0,使用<或<<,是將原本需要由鍵盤輸入的數據改由文件內容來替代。注意,<<代表的是結束輸入的意思。

  1. [root@localhost think]# cat > test <<"eof"  
  2. > my name is think  
  3. > hello world  
  4. > eof  
  5. [root@localhost think]# cat test  
  6. my name is think  
  7. hello world  

可以把>、<、>>想象成漏斗:數據會從大的一端進入,由小的一端出來。

>重定向符在目的文件不存在時,會新建一個。然而,目的文件已存在,它就會被覆蓋掉,原本的數據都會丟失。而>>在目的文件不存在時,會新建一個;存在時會追加到文件尾。

管道可以把兩個以上執行中的程序鏈接在一起,第一個程序的標准輸出可以變成第二個程序的標准輸入。因為,>或者<使用的是臨時文件,管道在速度上比臨時文件快上10倍。從最原始的數據開始,然後構造一條條管道,一步步地,管道中的每個階段都會讓數據更接近要的結果。請記得,構造管道時,應該試著讓每個階段的數據量變得更少。

  1. [root@localhost think]# cat > test01 << "eof"  
  2. > 1 2 5  
  3. > eof  
  4. [root@localhost think]# tr -d 2 < test01 | sort > test02  
  5. [root@localhost think]# cat test02  
  6. 1  5  

有個特殊文件,便是大家耳熟能詳的”位桶“--/dev/null。重定向到此文件的數據都會被系統丟掉。

最後介紹一下,什麼時候重定向?

運用場景:

1)屏幕輸出信息很重要,而且我們需要將其存下時

2)後台執行中的程序,不希望它打攪屏幕正常的輸出結果時

3)一些系統的例行工作,希望它可以存下來時

4)一些執行命令的可能已知錯誤信息,想以“2> /dev/null"將其丟棄時

5)錯誤信息與正確信息需要分別執行時

Copyright © Linux教程網 All Rights Reserved