【Linux 系統編程】shell 輸入/輸出重定向(四)

前言

原本計劃國慶節第一天假期休息一天,但是想想自己還有很多事情沒有完成,就立馬打開電腦,開始幹活了。打算這7天的假期好好整理下之前學的技術和鞏固練習,充實每一天,好了入正題,Linux shell腳本基礎前面我們在介紹Linux shell腳本的控制流程時,還有一部分內容沒講就是有關here document的內容這裏繼續,Here Document 是 Shell 中的一種特殊的重定向方式,用來將輸入重定向到一個交互式 Shell 腳本或程序。

原文鏈接請標明:
http://blog.csdn.net/u011974987/article/details/52703400
本文出自:【stromxu的博客】

學習資料來源於:http://www.runoob.com/linux/linux-shell-io-redirections.html


正文

接着上一篇繼續…

1、Shell 輸入/輸出重定向

重定向命令列表如下:
命令 說明
command > file 將輸出重定向到 file。
command < file 將輸入重定向到 file。
command >> file 將輸出以追加的方式重定向到 file。
n > file 將文件描述符爲 n 的文件重定向到 file。
n >> file 將文件描述符爲 n 的文件以追加的方式重定向到 file。
n >& m 將輸出文件 m 和 n 合併。
n <& m 將輸入文件 m 和 n 合併。
<< tag 將開始標記 tag 和結束標記 tag 之間的內容作爲輸入。
  • 需要注意的是文件描述符 0 通常是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。

1.1、輸出重定向

重定向一般通過在命令間插入特定的符號來實現,語法如下:

command1 > file1

上面這個命令執行command1然後將輸出的內容存入file1。

注意任何file1內的已經存在的內容將被新內容替代。如果要將新的內容添加到文件的末尾,則使用>>操作符。

例子

我們先新建一個文件test2,然後執行 ls -al 重定向到test2文件中,在命令行的操作符代碼如下:

#新建test2文件
touch test2    
#輸出重定向
ls -al > test2

然後我們使用cat命令查看文件內容:

root@iZ28t5k4ny4Z:/usr/xiho/shell# cat test3
total 132
drwxr-xr-x 2 root root  4096 Oct  1 13:19 .
drwxr-xr-x 4 root root  4096 Sep 27 16:29 ..
-rw-r--r-- 1 root root 12288 Sep 27 19:15 .01.sh.swo
-rw-r--r-- 1 root root 12288 Sep 27 16:35 .01.sh.swp
-rwxr--r-- 1 root root   347 Sep 28 21:07 02.sh
-rwxr--r-- 1 root root   100 Sep 28 21:28 03.sh
-rw-r--r-- 1 root root 12288 Sep 28 21:15 .03.sh.swp
-rwxr--r-- 1 root root   109 Sep 28 22:17 04.sh
-rw------- 1 root root 12288 Sep 30 18:03 .04.swp
-rw-r--r-- 1 root root     0 Sep 28 22:45 05.sh
-rw-r--r-- 1 root root 12288 Sep 28 22:47 .05.sh.swp
-rw-r--r-- 1 root root     0 Sep 30 20:57 06.sh
-rw-r--r-- 1 root root 12288 Sep 30 21:00 .06.sh.swp
-rwxrwxrwx 1 root root   223 Sep 30 17:50 b.sh
-rw-r--r-- 1 root root 12288 Sep 30 18:03 .b.sh.swo
-rw-r--r-- 1 root root 12288 Sep 28 16:50 .b.sh.swp
-rwxrwxrwx 1 root root   119 Oct  1 13:12 demo.sh
-rwxr--r-- 1 root root    68 Sep 30 14:09 test1.sh
-rw-r--r-- 1 root root   954 Oct  1 13:10 test2
-rw-r--r-- 1 root root     0 Oct  1 13:19 test3

就會把當前目錄下的所有文件給顯示出來了。

如果不希望文件內容被覆蓋,可以使用 >> 追加到文件末尾,這個請自行練習使用。


1.2、輸入重定向

和輸出重定向一樣,Unix 命令也可以從文件獲取輸入,語法爲:

command1 < file1

這樣,本來需要從鍵盤獲取輸入的命令會轉移到文件讀取內容。注意:輸出重定向是大於號(>),出入重定向是小於號(<)。

例子

接着上面的例子,我們統計test2文件的行數,(不熟悉命令的同學,請查看我的 shell命令(二)的文章),執行以下命令:

 wc -l test2
 21 test2

也可以將輸入重定向到test2文件中:

wc -l < test2
21

注意:上面兩個例子的結果不同;第一個例子,會輸出文件名;第二不會,因爲它僅僅知道從標準輸入讀取內容。

 command1 < infile > outfile

同時替換輸入和輸出,執行command1,從文件infile讀取內容,然後將輸出寫入到outfile中。


1.3、重定向深入理解

一般情況下,每一個Linux 命令運行時都會打開三個文件:

  • 標準輸入文件(stdin): stdin的文件描述符爲0,linux程序默認從stdin讀取數據。
  • 標準輸出文件(stdout): stdout 的文件描述爲1,linux程序默認想stdout輸出數據。
  • 標準錯誤文件(stderr): stderr 的文件描述符爲2,linux程序會想stderr流中寫入錯誤信息。

以後打開文件後。新增文件綁定描述符 可以依次增加。 一條shell命令執行,都會繼承父進程的文件描述符。因此,所有運行的shell命令,都會有默認3個文件描述符。

正常情況下,command > file 將stdout重定向file,command < file 將stdin 重定向到 file。

一個命令執行了:
先有一個輸入:輸入可以從鍵盤,也可以從文件得到
命令執行完成:成功了,會把成功結果輸出到屏幕:standard output默認是屏幕
命令執行有錯誤:會把錯誤也輸出到屏幕上面:standard error默認也是指的屏幕

如果希望stderr 重定向 到file 可以這樣寫:

command 2> file

如果希望stderr追加到file 文件末尾,可以這樣寫:

command 2>> file
  • 實例(通俗易懂)

顯示當前目錄文件,寫一個實際存在和一個不存在的,方便理解。比如當前目錄存在test1.sh,不存在xiho。代碼如下:

root@iZ28t5k4ny4Z:/usr/xiho/shell# ls test1.sh xiho 
ls: cannot access xiho: No such file or directory
test1.sh

看到上面代碼顯示在屏幕上面,找不到文件路勁報錯,正確輸出與錯誤輸出都顯示在屏幕了,但是現在需要把正確輸出寫入suc.txt, 1> 可以省略,不寫,默認所至標準輸出,把錯誤輸出到err.txt,不輸出到屏幕。

例子如下:

ls test1.sh xiho 1> suc.txt 2>err.txt

然後我們分別查看suc.txt和err .txt的信息。

這裏寫圖片描述

將錯誤輸出信息關閉掉

root@iZ28t5k4ny4Z:/usr/xiho/shell# ls test1.sh xiho 2>&-
test1.sh
root@iZ28t5k4ny4Z:/usr/xiho/shell# ls test1.sh xiho 2>/dev/null
test1.sh

&[n] 代表是已經存在的文件描述符,&1 代表輸出 &2代表錯誤輸出 &-代表關閉與它綁定的描述符
/dev/null 這個設備,是linux 中黑洞設備,什麼信息只要輸出給這個設備,都會給吃掉,哈哈~

其他的追加操作符等,好玩的自己去試試。

注意:
1、shell遇到”>”操作符,會判斷右邊文件是否存在,如果存在就先刪除,並且創建新文件。不存在直接創建。 無論左邊命令執行是否成功。右邊文件都會變爲空。
2、“>>”操作符,判斷右邊文件,如果不存在,先創建。以添加方式打開文件,會分配一個文件描述符[不特別指定,默認爲1,2]然後,與左邊的標準輸出(1)或錯誤輸出(2) 綁定。
3、當命令:執行完,綁定文件的描述符也自動失效。0,1,2又會空閒。
4、一條命令啓動,命令的輸入,正確輸出,錯誤輸出,默認分別綁定0,1,2文件描述符。
5、一條命令在執行前,先會檢查輸出是否正確,如果輸出設備錯誤,將不會進行命令執行。


2、Here Document

Here Document是shell 中的一種特殊重定向方式,用來將輸入重定向到一個交互式的shell腳本或程序。

基本的格式如下:

command << EOF
    document
EOF

它的作用是將兩個EOF之間的內容(docuemnt)作爲輸入傳遞給command。

注意:
- 結尾的EOF一定要頂個寫,前面不能有任何字符,後面也不能有任何字符,包括空格和tab縮進。
- 開始的EOF前後的空格不要被忽略掉。

  • 實例

在命令行中通過wc -l 命令計算Here Document 的行數:

root@iZ28t5k4ny4Z:/usr/xiho/shell# wc -l << EOF
> 學習使用shell 編程
> www.xuhaoblog.com
> EOF
2

輸出的結果爲2行。

我們也可以將Here Document 用在腳本中,例如:

1 #!/bin/bash                                                            
  2 cat << EOF
  3 學習使用shell腳本編程
  4 www.xuhaoblog.com
  5 EOF

執行以上腳本輸出的結果:

root@iZ28t5k4ny4Z:/usr/xiho/shell# chmod u+x 05.sh 
root@iZ28t5k4ny4Z:/usr/xiho/shell# ./05.sh
學習使用shell腳本編程
www.xuhaoblog.com

Here Document 的簡單使用就到這裏,還有更多的操作符需要我們去練習。Linux shell腳本基礎學習,我們差不多介紹完了,還有一個關於函數的,準備放到下一篇來講。歡迎關注~


更多相關係列文章傳送門:

【CSDN】Linux Shell腳本基礎學習系列

【Linux 系統編程】shell 腳本基礎學習(一)
【Linux 系統編程】shell 命令和流程控制(二)
【Linux 系統編程】shell 流程控制loop和引號(三)
【Linux 系統編程】shell 輸入/輸出重定向及HereDocument(四)
【Linux 系統編程】shell 腳本基礎學習之函數(五)

本文由博主辛苦整理下來的筆記;
希望大家能夠指點或提出寶貴意見,共同學習,謝謝!
轉載請註明出處:http://blog.csdn.net/u011974987/article/details/52703400
歡迎關注我的社交網站~
個人博客:xuhaoblog.com
新浪微博:http://weibo.com/xuxiho
GitHub:https://github.com/git-xuhao

發佈了81 篇原創文章 · 獲贊 319 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章