shell程式設計(1)管道和重新導向重新導向重新導向輸出
chen123@ubuntu:~/C++$ ls -l >lsoutput.txt
這條命令把ls命令的輸出儲存到檔案lsoutput.txt中。
檔案描述符0代表一個程式的標準輸入,檔案描述符1代表標準輸出,檔案描述符2代表標準錯誤輸出。在上面的例子中,通過>操作符把標準輸出重新導向到一個檔案。預設情況下,如果該檔案已經存在,它的內容將被覆蓋。使用set –C命令設定noclobber選項,從而阻止重新導向操作對一個已有檔案的覆蓋。也可以使用set +o noclobber或set -o noclobber開啟或關閉noclobber選項。
我們使用>>操作符將輸出內容附加到一個檔案中,例如
chen123@ubuntu:~/C++$ ps >>lsoutput.txt
這條命令將ps的輸出附加到指定檔案的尾端。
如果需要對標準錯誤輸出重新導向,可以使用2>操作符。因為標準錯誤輸出檔案描述符是2,所以在>前面加上2。
下面這條命令是把標準輸出和標準錯誤輸出分別重新導向到不同的檔案中
chen123@ubuntu:~/C++$ kill -HUP 1234>killout.txt 2>killerr.txt
如果想把兩組輸出都重新導向到一個檔案中,可以用>&操作符來結合兩個輸出。
chen123@ubuntu:~/C++$ kill -l 1234 > killouterr.txt2>&1
這條命令將標準輸出重新導向到killouterr.txt,然後將標準錯誤輸出重新導向到與標準輸出相同的地方。
可以直接使用UNIX的同樣資源回收筒/dev/null來有效地丟棄所以輸出資訊
chen123@ubuntu:~/C++$ kill -l 1234>/dev/null 2>&1
重新導向輸入
chen123@ubuntu:~/C++$ more < killerr.txt
很明顯,這樣做一樣不大,因為more可以直接接受檔案名稱作為參數。
chen123@ubuntu:~/C++$ more killerr.txt
管道
在linux下通過管道串連的進程可以同時運行,並且隨著資料流在他們之間的傳遞可以自動的進行協調。舉一個例子我們可以使用sort命令對ps命令的輸出進行排序。
如果我們不使用管道,這就需要分幾個步驟實現
chen123@ubuntu:~/C++$ ps > psout.txt
chen123@ubuntu:~/C++$ sort psout.txt >pssort.out
但如果使用管道更為精巧。
chen123@ubuntu:~/C++$ ps | sort >pssort1.out
如果想在螢幕上分頁顯示輸出結果,我們可以在連接第三個進程more,將他們都放在同一個命令列上。
chen123@ubuntu:~/C++$ ps | sort | more
如果有一系列的命令需要執行,相應的輸出檔案是在這一組命令被建立的同時立刻被建立或寫入的,所以決不要在命令流中重複使用相應的檔案名稱。如果嘗試執行如下命令
chen123@ubuntu:~/C++$ cat mydata.txt | sort| uniq | > mydata.txt
你最終將得到一個空檔案,因為你在讀取檔案mydata.txt之前就已經覆蓋了這個檔案的內容。
作為程式設計語言的shell
編寫shell指令碼程式有兩種方式。可以輸入一系列命令讓shell互動的執行它們,也可以把這些命令儲存到一個檔案中,然後將該檔案作為一個程式來調用。
互動式程式
假設我們尋找包含字串hello的檔案,可使用下面的互動式指令碼來執行整個操作:
chen123@ubuntu:~/C++$ for file in *
> do
> if grep -l hello $file
> then
> more $file
> fi
> done
請注意,在輸入shell命令的時候,shell提示符$會變成>符號。可以一直輸入下去,由shell來判斷何時輸入完畢並立刻執行指令碼程式。
建立指令碼
首先用文字編輯器建立一個名為first的檔案,其內容如下:
#!/bin/sh
#first
#This file looks through all the files inthe current
#directory for the string hello, and thenprints the names of
#those files to the standard output.
for file in *
do
ifgrep -q hello $file
then
echo$file
fi
done
exit0
其中#!字元告訴系統同一行緊跟在它後面的那個參數是用來執行文本的程式。
exit命令的作用是確保程式能夠返回一個有意義的退出碼。
可以用file命令來檢查檔案是否是指令碼程式。
chen123@ubuntu:~/C++$ file first
first: POSIX shell script text executable
執行指令碼
運行指令碼的方法有兩種
方法1:
chen123@ubuntu:~/C++$ /bin/bash first
方法2:
chen123@ubuntu:~/C++$ ./first