歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> shell編程:數據流重定向

shell編程:數據流重定向

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