430 likes | 601 Views
Shell 的動作. 提供一個提示符號,進入睡眠狀態,直到你輸入按鍵 當命令輸入時,檢查是否有特殊字元(* , ?) ,解釋特殊字元 建立一指令行,傳給 kernel 執行,當指令在執行時, shell 處於等待狀態 工作完成,提示符號重新出現, shell 重回睡眠狀態,開始另一個週期. Shell 解釋週期. 樣式比對-萬用字元. * 代替任何數量字元 ls – x chap* chap chap1 chap2 chap15 chapxyz ? 代替任何單個字元 ls – x chap? chap1 chap2 chap3. 樣式比對-字元類別.
E N D
Shell的動作 • 提供一個提示符號,進入睡眠狀態,直到你輸入按鍵 • 當命令輸入時,檢查是否有特殊字元(*, ?),解釋特殊字元 • 建立一指令行,傳給kernel執行,當指令在執行時,shell處於等待狀態 • 工作完成,提示符號重新出現,shell重回睡眠狀態,開始另一個週期
樣式比對-萬用字元 • * 代替任何數量字元 • ls –x chap* chap chap1 chap2 chap15 chapxyz • ? 代替任何單個字元 • ls –x chap? chap1 chap2 chap3
樣式比對-字元類別 • [] 代替括號中其中的一個字元 • ls –x chap[13] chap1 chap3 • - 指定字元範圍(必須左邊的字比右邊有較小的ASCII數值) • ls –x chap[1-3] chap1 chap2 chap3
樣式比對-反向字元類別 • ! 置於字元類別開頭,會將比對規則反向 • ls –x *.[!Z] 顯示有副檔名且不為.Z的檔案
當wildcards不具特殊意義 • * ?用於字元類別中 • !-置於字元類別外 • !不在字元類別的開頭 • - 字元類別左右字元適當 • * 不會比對以點開頭的檔案或路徑名稱中 的/號
Quoting Special Characters • If you want the shell to treat special characters as their own meaning, not as a special character, you must quote. • backslash \ • single quotes ‘ ‘ • back quotes ` ` • double quotes “ “
Quoting Special Characters % echo what time is it ? • Without the backslash, ? is treated as a wildcard % echo what time is it \? • The backslash does not appear in the output; it only purpose is to cancel the special meaning of the question mark • The backslash only works on a single character.
Quoting Special Characters • To produce the output *** STARTS *** • echo \*\*\* STARTS \* \* \* • echo ‘*** STARTS ***’
Quoting Special Characters `.........` • backquotes are use to enclose commands that you want the shell to run. • % echo It is now `date`. • % echo It is now date.
Quoting Special Characters • Double quotes (“.....”)are like single quotes but less powerful. • Putting double quotes around a string of characters cancels the special meaning of any of the characters except the dollar sing($), back quotes(`...`), or backslash (\)
echo的escape及quoting • /usr/bin/echo • \cescape sequence讓游標不換行立即出現 • echo ‘Enter your Name: \c’ • \t 定位鍵 • f 跳過一頁 • \n 換新行 • \07 嗶一聲 • echo ‘A\nB\n\07\tC’
echo • 重覆參數 • 察看shell的參數設定echo $PATH • 檔案名稱 * ?[ • 忽略參數間多餘的空白
sun4330% echo A B C A B C • sun4330% echo 'A B C' A B C • sun4330% /usr/5bin/echo 'A\nB\n\tC' A B C
轉向 Redirection • 指令不只能由鍵盤讀取以及由終端機顯示資料 • 指令可以利用字元串流(character stream)而不需知道輸入來源和輸出目的地 • 字元串流(character stream)是序列字元,對許多指令來說就像是輸入來源和輸出標的 • UNIX將這樣的串流視為檔案
Shell的標準串流檔案 • 在使用者一登入時將他們附著於使用者的終端輸入輸出設備,任何使用到這些串流的指令都可藉止來正常運作,登出時shell便將這些串流關掉 • 標準輸入 • 預設為鍵盤輸入 • 標準輸出 • 預設為終端機輸出 • 標準錯誤輸出 • 預設為終端機輸出 • 它們是可以被轉向到任何硬碟檔案或其他設備
標準輸出 • 類似who指令會將輸出轉成一字元串流,這串流稱為標準輸出,預設為顯示在終端機上 • 利用符號>和>>您可以將輸出轉向至一個磁碟檔 • 當一指令的輸出轉向至一檔案時,輸出檔案會先被shell建立,然後指令才被執行
輸出重導 • 當Shell看到 > 時將標準輸出傳送到檔案 • > • 將前端的命令輸出重導到後面的檔案上 • cal 4 2002 > spring • ls >lslist
附加型(append)輸出重導 • 將結果附加在原檔案內容的後面 • >> • cal 5 2002 >> spring
標準輸入 Standard Input • 許多指令的輸入也是由串流讀取而來,這串流叫做指令的標準輸入
標準輸入的三種來源 • wc …… [ctrl-d] • wc指令不接檔案名稱,會預期由鍵盤輸入 wc 2 ^ 32 5 + 10 [ctrl+d] 2 6 14
標準輸入 • 標準輸入也可以轉向成由檔案內容而來 • 利用<來作輸入的轉向,shell會將wc所需的輸入由檔案提供 • wc < calc.lst (wc並沒有開啟檔案calc.lst) 3 9 30 • wc calc.lst (wc開啟檔案calc.lst) 3 9 39 calc.lst
輸入重導 • shell從普通檔案讀取輸入資料 • < • mail melanie@mis.yuntech.edu.tw < spring
標準輸入的三種來源 • 當標準輸入由檔案轉向而來時(利用<),是由shell來開啟檔案。在這指令完全不管shell的動作。然而,當檔案名稱直接提供給指令當參數時,指令會去開啟檔案,而非shell。
利用批次模式 • 同時用到stdin stdout bc < calc.lst >result.lst
同時由檔案和標準輸入來提供輸入 • 當一指令由多個來源讀取輸入時,比方一檔案以及標準輸入,符號 – 用來明確指定輸入的順序 • cat – foo先stdin再檔案foo • cat foo – bar先檔案foo ,stdin再檔案bar
標準錯誤輸出 • 標準串流的代碼(檔案描述器) • 0 標準輸入 • 1 標準輸出 • 2 標準錯誤 • C shell將標準錯誤標準輸出合併在一起
合併串流 • <,>和>>對介於它們之間的空白字元不加理會,shell會替指令處理串流的來源和標的。 wc < infile >newfile wc > newfile <infile >newfile< inflie wc
合併串流 • stdout 及stderr同一指令行 cat newfile nofile 2> errorfile > outfile
重導標準錯誤(C shell) • >&;將錯誤訊息重導到檔案中 command >&errfile • To redirect standard output and standart error to different files (command > outputfile)>&errfile • To redirect standard output and standart error to the same file command >& outfile
/dev/null 將檔案清為空白 cal 2003 >/dev/null cat /dev/null 或避免錯誤訊息顯示 cat chap100 2>/dev/null /dev/stty 輸出顯示到目前的終端機 who > /dev/tty /dev/null &/dev/stty
管線pipe • 管線是將某個程式的標準輸出連接到另一程式的標準輸入 • I/O重導和管線可以用在同一個命令中 • Command1 | command2 | command3 • cal 2003;cal2004|more • ls |wc –l >fcount • man grep | col –b > grep.txt • man grep | col –b | lp • 在管線處理中,管線符號左邊的指令必須支援標準輸出,而右邊的指令必須支援標準輸入
Wc [-lcw] filelist -l 行數 -w 字數 -c 字完數 I/O重導 ls /faculty/melanie > tmpcount wc –l tmpcount rm tmpcount pipe ls /faculty/melanie|wc –l 用wc來數列表中有多少檔案
tee • 讀取standin,並結果將送到standout及其他檔案 • 擷取command1之輸出,將輸出導出傳送到檔案outfile與command2 command1 | tee outfile |command2 • who | tee user.lst • who | tee user.lst| wc –l • who | tee /dev/tty |wc -l • spell chapt | tee errwords
grep尋求特定字串 • 由標準輸入依照樣本字元逐行搜尋 • 只要包含所要的樣本字元都會印在標準輸出上 • Grep [-cilnv] pattern [filelist] • 找出以l開始的行列 ls -l /usr/local/bin | grep \^l • 找出process中含有melanie的process ps aux | grep melanie
To search several C-language source files for the pattern strcpy, • grep 'strcpy' *.c • 包含樣本字元的行號 • grep –n ‘strcpy’ *.c • 列出包含樣本字元的檔案名稱 • grep –l ‘strcpy’ *.c • 列出不包含樣本字元的所有列 • grep –v ‘strcpy’ out3.c
Shell 變數 • 設定變數值 • variable=value (兩邊不可有空白) • 取消設定 • unset variable • 查詢變數值 • echo $variable
C Shell 變數 • 設定變數值 • set variable=value (兩邊不可有空白或有空白) • set x=10 • set mydir=`pwd` • 查詢變數值 • echo $variable
shell script • 將多個指令儲存在一個檔案中然後執行整個檔案 • 以直譯interpretive的模式執行 • 執行 • 方法一 sh script.sh • 方法二 chmod u+x script.sh script.sh