Shell學習之:輸入輸出重新導向,shell重新導向

來源:互聯網
上載者:User

Shell學習之:輸入輸出重新導向,shell重新導向

詳細理解:

linux命令預設從標準輸入裝置(stdin)擷取輸入,將結果輸出到標準輸出裝置(stdout)顯示。一般情況下,標準輸入裝置就是鍵盤,標準輸出裝置就是終端,即顯示器。在linux shell執行命令時,每個進程都和三個開啟的檔案相聯絡,並使用檔案描述符來引用這些檔案。由於檔案描述符不容易記憶,shell同時也給出了相應的檔案名稱:

                                               檔案描述符說明列表

檔案 檔案描述符
輸入檔案-標準輸入 0(預設為鍵盤;0為檔案或其他命令的輸出)
輸出檔案-標準輸出 1(預設為螢幕;1為檔案)
錯誤輸出檔案-標準錯誤 2(預設為螢幕;2為檔案)


                                              全部可用的命令列列表

命令 說明
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 之間的內容作為輸入。

預設情況下,command > file 將stdout重新導向到file,command < file 將stdin重新導向到file。


  • 如果希望stderr重新導向到 file,可以這樣寫

$ command 2 > file     # 2表示標準錯誤檔案(stderr)

  • 如果希望stderr追加到file檔案末尾,可以這樣寫

$ command 2 >> file    # >>表示追加寫入,不覆蓋之前的內容

  • 如果希望將stdout和stderr合并後重新導向到file,可以這樣寫

$ command > file 2>&1或$ command >> file 2>&1

  • 如果希望對stdin和stdout 都重新導向,可以這樣寫
$ command < infile > outfile # command命令將stdin重新導向到infile,將stdout重新導向到outfile

有個空裝置的檔案的重新導向輸出,如果想屏蔽stdout,stderr,則:

$ ping a.b.c > /dev/null 2>&1


輸出重新導向:

linux命令的輸出可以是,預設是螢幕

  • 螢幕顯示器
  • 檔案

比如說,執行who這個命令,如果不重新導向到檔案的話,在螢幕下會回顯:

$ who user1        tty01   Jan 12 01:30user2        tty02   Jan 12 02:30user3        tty03   Jan 12 03:30user4        tty04   Jan 12 04:30user5        tty05   Jan 12 05:30
但如果執行的是下面的命令,那麼who命令執行的結果,只能用cat,more或less在users檔案裡查看了。

$ who > users

如果在剛才的users檔案裡面執行下面的內容,則users的內容就被覆蓋了:

$ echo "Line 1" > usersLine 1$
如果不想被覆蓋,就必須用:>>

$ echo "Line 2" >> usersLine 1Line 2$
輸入重新導向:

  • 例1: 拿剛才的users檔案,要統計其行數

$ wc -l < users2$

  • 例2: 將檔案file1內容發送給test@163.com,郵件標題為: Email Test

mail -s "mail test" test@163.com < file1

  • 例3: 拿剛才users檔案內容進行大小寫轉換,然後重新輸出到 > users2

$ tr 'a-z' 'A-Z' < users > users2LINE 1LINE 2

  • 例4: 用bc命令來計算cal.txt輸入中的內容  

$ echo 1+2 > cal.txt$ bc < cal.txt3$

  • 例5: 用sort命令來對輸入檔案排序,排序後重新導向到輸出檔案
$ cat fruits_intomatostrawberrypearapplecherry$ sort < fruits_in > fruits_out$ cat fruits_outapplecherrypearstrawberrytomato

Here Document:

Here Document:是Shell中的一種特殊的重新導向方式,它的基本的形式如下:

command << delimiter    documentdelimiter
它的作用是將兩個delimiter之間的內容(document) 作為輸入傳遞給command. 最主要的用途:用於指令碼命令行互動中。下面會舉例子:


NOTE:

  • 開始的delimiter前後的空格會被忽略掉.
  • 結尾的delimiter一定要頂格寫,前面不能有任何字元,後面也不能有任何字元,包括空格和tab縮排
  • delimiter可以使任何tag,只要滿足上面兩個條件
  • Here Document可用於命令列中,或指令碼裡面

舉例如下:


  • 例子1: 用wc -l命令計算document的行數
$wc -l << EOF    This is line 1    This is line 2    This is line 3EOF3$
  • 例子2: 用cat命令將here docuemnt讀取出來
$ touch test1.sh$ chmod +x ./test1.sh#!/bin/bashcat << TAG  aaaaaaaaaaaaaa  bbbbbbbbbbbbbb  ccccccccccccccTAG$ ./test1.sh  aaaaaaaaaaaaaa  bbbbbbbbbbbbbb  cccccccccccccc
  • 例子3:用vi命令,在指令碼裡面,將編輯的內容寫入檔案中
$ touch test2.sh$ chmod +x ./test2.sh#!/bin/bashfilename=test.txted $filename << delimiter  This is line 1  This is line 2  This is line 3.wqdelimiter$ ./test2.sh$ cat test.txt  This is line 1  This is line 2  This is line 3$
  • 例子4:用here document在指令碼中實現對Mysql資料的操作;
$ mysql -u root -p passwordWelcome to the MySQL monitor.    Commands end with ; or \g. Your MySQL connection id is 1257 Server version: 5.1.35-community MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A mysql> select * from user; mysql> exit Bye
要在指令碼中實現上面的命令列互動方式,可以用here document在shell中實現
#!/bin/sh mysql -u root -p password << EOF_MYSQL   use mysql   select * from user;   exit EOF_MYSQL



SHELL編程 輸出重新導向

grep -v $bbb xxx.txt | cat >xxx.txt

在管道前後對同一個檔案操作很危險。這樣同時有兩個程式對同一個檔案讀寫,會產生競爭。最後的結果不好確定。最好分開處理。

rep -v $... xxx.txt >xxx.txt 這樣做也不好。通過重新導向後也會發生對同一個檔案同時讀寫的情況。 但至少是同一個程式來控制(如果不算shell)。grep可能已經考慮過這樣的情況,或者巧合(處理時先讀,再寫), 所以結果正確。但同其他程式的配合,情況就更複雜了,很可能出現問題。
具體要看grep,shell和cat代碼。

但總體上,不建議這樣做。這樣做是極危險的行為。最好用一個備份檔案,避免同時對一個檔案讀寫操作。
 
shell 重新導向

shell上:
0表示標準輸入
1表示標準輸出
2表示標準錯誤輸出
2>&1意思是:把 標準錯誤輸出 重新導向到 標準輸出.

>代表輸出重新導向

|:是管道,例子:
cmd1 | cmd2 意思是:命令cmd1的標準輸出座位cmd2的標準輸入.

詳細解釋第三個命令列,(ls you no;ls yes) 2>&1|egrep \* >file:
2>&1意思是:把 標準錯誤輸出 重新導向到 標準輸出.
|意思是:管道;
egrep \* :搜尋所有的字串.
>file: 把標準輸出匯入檔案file(如果file存在則清空file,不存在則建立.);

呵呵
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.