shell編程 之 輸入輸出重定向

1 輸入輸出重定向

    標準輸入:從終端獲得命令,對於計算機來講,是從終端得到了命令,執行完了之後,結果和執行狀態或者錯誤提示又會發回終端,這叫標準輸出。linux

    輸入輸出重定向就是從終端之外的別的地方獲得輸入,或者向終端之外的別的地方輸出。shell

    命令和說明bash

        command > file 將輸出重定向到 file。
        command < file 將輸入重定向到 file。
        command >> file 將輸出以追加的方式重定向到 file。
        n > file 將文件描述符爲 n 的文件重定向到 file。   #文件描述符,能夠理解爲內核給打開的文件的標識,它和文件不是一一對應的,0標準輸入,1標準輸出,2標準錯誤
        n >> file 將文件描述符爲 n 的文件以追加的方式重定向到 file。
        n >& m 將輸出文件 m 和 n 合併。
        n <& m 將輸入文件 m 和 n 合併。
        << tag 將開始標記 tag 和結束標記 tag 之間的內容做爲輸入。函數

 

    下面是詳解:spa

2 輸出重定向

    輸出重定向通常在終端命令行裏的比較多,在腳本比較少。命令行

    實例1:echo "hello linux!">t3.sh    (hello linux就跑到t3,.sh裏去了)想看的話須要cat t3.shcode

    實例2:blog

demoFun(){        
    echo "這是個人第一個 shell 函數!"        #這是函數主體,前一行後一行有大括號
}
demoFun >t3.sh    #這是個人第一個 shell 函數!    就跑到t3.sh裏去了

3 輸入重定向

    原本須要從鍵盤獲取輸入的命令會轉移到文件讀取內容。排序

    command < filename  意思是把c o m m a n d命令以f i l e n a m e文件做爲標準輸入生命週期

    實例1:wc -l <t3.sh(以t3.sh做爲標準輸入之後,算一算t3裏有幾行文件)說實話,此處的做用和wc -l t3.sh是同樣的,可是運行方法仍是不一樣的。

    實例2:commed < infile > outfile,從文件infile讀取內容,而後將輸出寫入到outfile中。

        好比:sort <name.txt >name.out,

從name.txt中獲取文件內容,排序之後輸出到name.out中

    補充:重定向操做符

        例子1:cat >> myfile <<MAYDAY     #<<MAYDAY的意思是,把MAYDAY和下一個MAYDAY(別的沒有歧義的字符也能夠)之間的內容當作輸入,重定向到cat中,而>>myfile會把cat的內容輸出重定向到myfile文件中。

    例子2:

$ sort << el    #任意字符均可以,常見的是EOF    #該命令的意思是把el和el之間的內容輸入重定向到sort
heredoc> 345
heredoc> 123
heredoc> ndj
heredoc> abd
heredoc> el
#輸出結果以下
123
345
abd
ndj

4 重定向的原理

    通常狀況下,每一個 Unix/Linux 命令運行時都會打開三個文件:

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

    默認狀況下,command > file 將 stdout 重定向到 file,command < file 將stdin 重定向到 file。

    若是但願 stderr 重定向到 file,能夠這樣寫:command 2 > file

  若是但願標準錯誤和標準輸出都重定向到一個文件中,能夠這樣寫:command > file 2>&1  #理解爲把標準錯誤先重定向到標準輸出中,再把標準輸出重定向到file中。

5 /dev/null約等於黑洞

    任何重定向到這個文件:/dev/null的輸出,都不會有結果,由於它禁止輸出。

6  永久重定向腳本中的全部輸出

    若是腳本中有大量的輸出須要重定向,使用上面的臨時重定向方式就很是繁瑣,能夠採用exec命令指定腳本生命週期內的重定向文件描述符,以下例子。

#!/bin/bash

# 在腳本執行期間全部的標準輸出都會保存到文件syslog

exec 1> syslog    #把全部的標準輸出全都輸出到syslog去

dir=/home/yarn/bash01
for  file in $dir/*
do
  if [ -d "$file" ]
  then
    echo "$file is a directory!"
fi

 7 在腳本中重定向輸入

#!/bin/bash

exec  0< filename    #標準輸入來自filename,filename的內容是:hehe \n  haha \n

while  read line
do
  echo "From file parameter is  $line"
done

#獲得結果:
hehe
haha

經過exec命令把標準輸入設備鍵盤重定向到文件,將配置信息寫入到文件,在腳本中循環讀取文件中的信息並賦值給變量並在腳本運行期間引用。經過read命令能夠從命令行讀取用戶輸入到的參數,當標準輸入重定向到文件後,read命令一樣能夠從文件中讀取記錄。

相關文章
相關標籤/搜索