shell學習三十三天----關於重新導向

來源:互聯網
上載者:User

標籤:終端   訊息   存在   time   archive   consumer   ror   mit   郵件   

關於重新導向

額外的重新導向運算子

使用set -C搭配

POSIX shell提供了防止檔案意外截斷的選項:運行set -C命令可開啟shell所謂的禁止覆蓋選項,當它再開啟狀態時,單純的>重新導向遇到目標檔案已存在時,就會失敗.>|運算子則能夠另noclobber選項失效.

 

提供行內輸入的<<和<<-:使用program<<得力miter,能夠在shell指令碼本文內提供輸入資料;這樣資料叫嵌入檔案.在預設情況下,shell能夠在嵌入檔案本文內做變數.命令和算數替換.

#!/bin/bash

cd /home

du -s * |

        sort -nr |

                sed 10q |

                        while read amount name

                        do

                                mail -s "disk usage waring " $name<<EOF

                                Greetings ,You are one of the  top of 10 consumers of disk ...

                            Please clean up unneeded files ,as soon as possible

                            Thanks .

                            EOF

                        done

 

分析:當中郵件內容就是輸入資料.

 

假設界定符以不論什麼一種形式的引號括起來,shell便不會處理輸入的內文,案例:

[[email protected] tmp]# i=5

[[email protected] tmp]# cat <<‘E‘OF

> this is the calue if i : $i

> here is a command sub :$(echo hello,world)

> EOF

this is the calue if i : $i

here is a command sub :$(echo hello,world)

 

界定符沒有不論什麼引號隔開

cat <<EOF

> this is the calue if i : $i

> here is a command sub :$(echo hello,world)

> EOF

this is the calue if i : 5

here is a command sub :hello,world

 

嵌入檔案重新導向器的另外一種形式有一個負號結尾.這樣的情況下,全部開頭的定位字元(Tab)在傳遞給程式作為輸入之前,都從嵌入檔案與結束定界符中刪除(注意:僅僅有開頭的定位字元會被刪除,開頭的空格不會刪除).這麼做,讓shell指令碼更易於閱讀了.

以<>開啟一個檔案作為輸入輸出僅僅用

使用program<>file,可供讀取與寫入操作.預設是在標準輸入上開啟file.一般來說,<以僅僅讀模式開啟檔案,而>以僅僅讀模式開啟.<>運算子則是以讀取與寫入兩種模式開啟給定的檔案.這交由program確定並充分利用;實際上,使用這個操作符並不須要太多的支援.

 

檔案描寫敘述符處理

linux用檔案描寫敘述符來標示每個檔案對象.檔案描寫敘述符是一個非負整數,能夠唯一的標示回話中開啟的檔案.

 

bash保留了3個檔案描寫敘述符

檔案描寫敘述符

縮寫

描寫敘述

0

STDIN

標準輸入

1

STDOUT

標準輸出

2

STDERR

標準錯誤

 

 

STDIN檔案描寫敘述符代表shell的標準輸入,對於終端來說,白鳥准輸入就是鍵盤.

在使用輸入重新導向符號(<)時,linux會用重新導向指定的檔案來替換標準輸入檔案描寫敘述符.

STDOUT檔案描寫敘述符代表標準的shell輸出.在終端上,標準輸出就是顯示器.

使用輸出重新導向符號(>,>>),能夠將要輸出到顯示上的內容從定向到指定的檔案裡.

 

STDERR檔案描寫敘述符用來處理錯誤訊息,它代表shell的標準錯誤輸出.

 

預設情況下STDOUT和STDERR指向相同的地方,預設情況下,錯誤訊息也會輸出到顯示器輸出.

 

重新導向錯誤輸出

僅僅重新導向錯誤,例如以下:在上面的表中看到STDERR檔案描寫敘述符被設定成2

[[email protected] tmp]# ls t 2>error

[[email protected] tmp]# cat error 

ls: 無法訪問t: 沒有那個檔案或檔案夾

重新導向錯誤和資料:

[[email protected] tmp]# mkdir task

[[email protected] tmp]# cd task/

[[email protected] task]# mkdir task

[[email protected] task]# ls task t 2>error 1>list

[[email protected] task]# cat list

task:

[[email protected] task]# cat error 

ls: 無法訪問t: 沒有那個檔案或檔案夾

分析:假設出現錯誤,就將錯誤資訊放入error;假設正確,就將輸出資訊放到list中.

也能夠將STDOUT和STDERR輸出到同一個檔案:

[[email protected] tmp]# mkdir task

[[email protected] tmp]# ls task t&>out

[[email protected] tmp]# cat out       

ls: 無法訪問t: 沒有那個檔案或檔案夾

task:

在指令碼中重新導向輸出有兩種方式:

1.暫時重新導向每行輸出

2.永久重新導向指令碼中的全部命令

 

先看第一種----暫時重新導向

如要有益在指令碼中建置錯誤訊息,須要將單獨的一行(echo &”error msg>” &2)輸出重新導向到STDERR.

案例:

#!/bin/bash

echo "error msg" >&2

echo "normal msg"

運行指令碼,輸出結果:

error msg

normal msg

分析:在重新導向檔案描寫敘述符時,你必須在檔案描寫敘述符數字和輸出重新導向符號之間加上一個&符號.

預設情況下,linux會將STDERR定向到STDOUT.可是,假設在執行指令碼時重新導向了STDERR,指令碼中全部定向到STDERR的文本都會被重新導向,案例:

[[email protected] tmp]# ./test.sh 2>test

normal msg

[[email protected] tmp]# cat test

error msg

分析:把運行指令碼的標準錯誤輸出重新導向到test,而在上一步中,將”error msg”定向到了標準錯誤輸出.

 

另外一種----永久重新導向

假設在指令碼中有大量資料須要重新導向,能夠使用exec命令告訴shell在指令碼運行期間重新導向到某個特定檔案描寫敘述符:

bash代碼:

#!/bin/bash

exec 1>testout

echo "error msg2"

echo "normal msg2"

echo "error msg1"

echo "normal msg1"

運行:

[[email protected] tmp]# ./test1.sh  

[[email protected] tmp]# cat testout 

error msg2

normal msg2

error msg1

normal msg1

 

在指令碼中重新導向輸入:

使用exec命令將STDIN重新導向到linux系統上的檔案裡:
exec 0< testfile

這個命令告訴shell從檔案testfile中獲得輸入,而不是STDIN.

 

 

擴充exec命令:

文法:exec [ program [arguments...] ]

用途:

以新的程式代替shell,或改變shell本身的I/O設定.

主要選項:

行為:

搭配參數----也就是使用指定的程式代替shell,以傳遞參數給它.假設僅僅是用I/O重新導向,則會改變shell本身的檔案描寫敘述符.

 

 

詳細的參考:

http://www.cnblogs.com/peida/archive/2012/11/14/2769248.html

shell學習三十三天----關於重新導向

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.