shell 中的<,<<,>,>>
檔案描述符 linux啟動後,會預設開啟3個檔案描述符,分別是:標準輸入standard input 0,正確輸出standard output 1,錯誤輸出:error output 2 以後開啟檔案後。新增檔案綁定描述符 可以依次增加。 一條shell命令執行,都會繼承父進程的檔案描述符。因此,所有啟動並執行shell命令,都會有預設3個檔案描述符。 linux shell下常用輸入輸出操作符是: 1. 標準輸入 (stdin) :代碼為 0 ,使用 < 或 << ; /dev/stdin -> /proc/self/fd/0 0代表:/dev/stdin 2. 標準輸出 (stdout):代碼為 1 ,使用 > 或 >> ; /dev/stdout -> /proc/self/fd/1 1代表:/dev/stdout3. 標準錯誤輸出(stderr):代碼為 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr >,>>輸出重新導向:表示把將輸出重新導向到螢幕或者裝置或者檔案下面我們直接看一些例子吧
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1ls: 無法訪問t.txt1: 沒有那個檔案或目錄t.txt# 正確輸出和錯誤輸出都顯示在螢幕上# 我們試著把正確輸出重新導向到suc.txt(success),可以看到螢幕輸出上只有錯誤輸出了,#從這裡也可以看出,預設的正確輸出(代碼為1,)是可以忽略不寫的qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >suc.txtls: 無法訪問t.txt1: 沒有那個檔案或目錄qiweijie@qiweijie:~/study_shell$ cat suc.txt t.txt# 正確輸出和錯誤輸出分別輸出到不同的檔案qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 1>suc.txt 2>err.txtqiweijie@qiweijie:~/study_shell$ cat suc.txt err.txt t.txtls: 無法訪問t.txt1: 沒有那個檔案或目錄# >> 這樣寫表示追加到檔案qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 1>>suc.txt 2>>err.txtqiweijie@qiweijie:~/study_shell$ cat suc.txt err.txt t.txtt.txtls: 無法訪問t.txt1: 沒有那個檔案或目錄ls: 無法訪問t.txt1: 沒有那個檔案或目錄# &[-,1,2] 分別表示關閉對應的標識,正確輸出,錯誤輸出# 關閉錯誤輸出qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 2>&-t.txt# 錯誤輸出重新導向到/dev/nullqiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 2>/dev/nullt.txt# 錯誤輸出重新導向到到檔案qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 2>err1.txtt.txt# 關閉正確輸出和錯誤輸出qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 1>&- 2>&-# 都輸出到/dev/nullqiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 1>/dev/null 2>/dev/null # 把錯誤輸出重新導向到正確輸出,正確輸出重新導向到/dev/nullqiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 1>/dev/null 2>&1 qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >/dev/null 2>&1 qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >ttt.txt 2>&1 qiweijie@qiweijie:~/study_shell$ cat ttt.txt ls: 無法訪問t.txt1: 沒有那個檔案或目錄t.txt# &代表所有輸出qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 &>/dev/nullqiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 &>te.txtqiweijie@qiweijie:~/study_shell$ cat te.txt ls: 無法訪問t.txt1: 沒有那個檔案或目錄t.txt
輸入重新導向<,<<也是直接來看一些例子吧
# cat命令表示從螢幕擷取輸入,然後輸出qiweijie@qiweijie:~/study_shell$ catsadfsadf# 最簡單的例子,從螢幕擷取輸入,然後重新導向給qwj(這裡用到是的是輸出重新導向qiweijie@qiweijie:~/study_shell$ cat > qwjqiweijie shi 2Bqiweijie@qiweijie:~/study_shell$ cat qwj qiweijie shi 2B#這裡首先是從檔案qwj擷取輸入給cat,然後cat輸入重新導向給qwj1qiweijie@qiweijie:~/study_shell$ cat > qwj1 <qwj qiweijie@qiweijie:~/study_shell$ cat qwj1qiweijie shi 2B# << 兩個小於符號連在一起表示接受一個輸入結束的標識,當輸入這個標識是結束輸入qiweijie@qiweijie:~/study_shell$ cat > qq << eof> q> w> j> eofqiweijie@qiweijie:~/study_shell$ cat qqqwjqiweijie@qiweijie:~/study_shell$ cat > qqq << e> q> w> eqiweijie@qiweijie:~/study_shell$ cat qqqqwqiweijie@qiweijie:~/study_shell$
exec繫結重新導向
# 綁定新的檔案描述符之前的狀態qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd0 1 2 3# 綁定一個新的檔案描述符6,並且綁定標準輸出(相當於給標準輸出儲存一個臨時copy)qiweijie@qiweijie:~/study_shell$ exec 6>&1qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd0 1 2 3 6# 綁定標準輸出給suc.txtqiweijie@qiweijie:~/study_shell$ exec 1>suc.txt # 發現標準輸出都沒有了啊qiweijie@qiweijie:~/study_shell$ ls -al# 儼然發現suc.txt已經是輸出檔案qiweijie@qiweijie:~/study_shell$ cat suc.txt cat: suc.txt:輸入檔案是輸出檔案qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd# 把標準輸出綁定回來qiweijie@qiweijie:~/study_shell$ exec 1>&6qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd0 1 2 3 6# 關閉自訂的檔案描述符qiweijie@qiweijie:~/study_shell$ exec 6>&-qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd0 1 2 3qiweijie@qiweijie:~/study_shell$ cat suc.txt 總用量 128drwxrwxr-x 2 qiweijie qiweijie 4096 11月 24 10:50 .drwxr-xr-x 34 qiweijie qiweijie 4096 11月 24 10:06 ..-rw-rw-r-- 1 qiweijie qiweijie 61 11月 18 14:19 atlga.xml-rw-rw-r-- 1 qiweijie qiweijie 35 11月 18 14:16 atlga.xml.old-rw-rw-r-- 1 qiweijie qiweijie 13 11月 17 16:17 dos-file.txt-rw-rw-r-- 1 qiweijie qiweijie 52 11月 24 10:11 err1.txt-rw-rw-r-- 1 qiweijie qiweijie 104 11月 24 10:09 err.txt-rw-rw-r-- 1 qiweijie qiweijie 41 11月 18 14:20 example.txt-rwxrwxr-x 1 qiweijie qiweijie 94 11月 17 16:56 finduser-rw-rw-r-- 1 qiweijie qiweijie 0 11月 24 10:50 g-rw-rw-r-- 1 qiweijie qiweijie 324 11月 18 14:57 merge-sales.sh-rw-rw-r-- 1 qiweijie qiweijie 271 11月 18 17:08 my-friends-rw-rw-r-- 1 qiweijie qiweijie 140 11月 23 17:43 my-friends.sh-rwxrwxr-x 1 qiweijie qiweijie 141 11月 17 16:34 nusers-rw-rw-r-- 1 qiweijie qiweijie 1958 11月 18 13:54 passwd.txt-rw-rw-r-- 1 qiweijie qiweijie 6 11月 24 10:48 qq-rw-rw-r-- 1 qiweijie qiweijie 4 11月 24 10:49 qqq-rw-rw-r-- 1 qiweijie qiweijie 35 11月 18 14:54 quotas-rw-rw-r-- 1 qiweijie qiweijie 16 11月 24 10:46 qwj-rw-rw-r-- 1 qiweijie qiweijie 16 11月 24 10:47 qwj1-rw-rw-r-- 1 qiweijie qiweijie 39 11月 18 14:53 sales-rw-rw-r-- 1 qiweijie qiweijie 0 11月 24 11:00 suc.txt-rw-rw-r-- 1 qiweijie qiweijie 58 11月 24 10:40 te.txt-rwxrwxr-x 1 qiweijie qiweijie 55 11月 17 17:02 trace1.sh-rw-rw-r-- 1 qiweijie qiweijie 58 11月 24 10:31 ttt.txt-rw-rw-r-- 1 qiweijie qiweijie 23733 11月 18 15:52 t.txt-rw-rw-r-- 1 qiweijie qiweijie 14 11月 17 16:18 unix-file.txt-rw-rw-r-- 1 qiweijie qiweijie 13 11月 17 16:20 unix.txt-rw-rw-r-- 1 qiweijie qiweijie 25 11月 17 16:15 UN工x-file.txt01236# 如果直接把標準輸出綁定到檔案,那麼問題就是,你再也變不回來了qiweijie@qiweijie:~/study_shell$ exec 1>suc.txt qiweijie@qiweijie:~/study_shell$ cat suc.txt cat: suc.txt:輸入檔案是輸出檔案qiweijie@qiweijie:~/study_shell$ exec 1>&-qiweijie@qiweijie:~/study_shell$ cat suc.txt cat: 標準輸出: 錯誤的檔案描述符qiweijie@qiweijie:~/study_shell$ ls /proc/self/fdls: 寫入錯誤: 錯誤的檔案描述符qiweijie@qiweijie:~/study_shell$
相信通過這些例子,大家對檔案描述符和<,<<,>,>>這四個符號應該有一定的印象了吧