三、Shell 

  1. 輸出入轉向
    在 UNIX 中,每一個 process 均有三個特殊的 file descriptor , 標準輸入
    ( standard input )、標準輸出 ( standard output )、標準錯誤輸出( standard
    error )。這三個平常是接受 terminal 的輸入,而由 terminal 顯示出去。但是
    UNIX 提供使用者可以使用一般的檔案或 pipe 來取代這些標準輸出入設備。在
    tcsh 裡頭,使用者可以利用">"和"<"來進行輸出入轉向的工作。
    
    輸出轉向:
      command > file
      
        你可以將一個指令的輸出結果轉向到一個檔案,讓此檔案儲存這個 command
        的輸出結果。
        
        但是請注意,如果 file 已經存在在系統中,則 file 將會被蓋過。也就是
        原先 file 的內容將會消失。
        
      command >& file
      
        與 > 相同,但是這個格式表示連 standard error 一起轉向。在 UNIX 中,
        standard error 在 programer 的習慣是用來顯示 error 的發生,因此如果
        沒有被轉向時, standard output 的結果將會被轉向到 file ,而 standard
        error 的結果仍將顯示在 terminal 上。
        
      command >> file
      
        此格示代表將 standard output 的結果 append 到 file 中。如果 file 已
        存在在系統中,則 standard output 的結果將會加到 file 的末端,如果 file
        原先並不存在,則 file 將會被開啟而將 standard output 的結果存至 file
        中。
        
      command >>& filE
      
        同上,不過此格式代表連 standard error 一起 append 到 file 之中。
      
    輸入轉向
      command < file
      
        一般程式須要自終端機輸入資料,而你可以將程式所要輸入的資料統一
        編入檔案中,利用轉向一併輸入。
        
    set ignoreeeof
      由於轉向輸出會有將現有檔案 overwrite 的危險,csh 與 tcsh 提供使用
      者一個方式來避免。
      
      當你執行 set ignoreeeof 之後,如有輸出轉向到已存在之檔案時,它會
      發出一個檔案已存在的訊息。 而在處理 append 轉向上,如果已經 set 
      ignoreeeof ,則當要 append 一個不存在的檔案,將會出現一個 error 
      messege 。
      
      然而如果我們當真是要轉向蓋過一個已存在的檔案,或者是要 append 一
      個不存在的檔案時,又要如何呢?  
      
      我們只要在 ">" ">&" ">>" ">>&" 後面加上驚嘆號"!",成為 ">!" , ... 就
      可以了。
                      
  2. Pipe
    如同前面說的轉向,Pipe 也是在標準輸出入和標準示誤裝置間作取代動作,如
    此一來可以將某一個程式的輸出連到另一個程式的輸入中。其語法如下:
    
    command1 | command2 [ | command3 ....]
    command1 |& command2 [ |& command3 ....] <--- 連 standard error 一起 pipe
    
    
  3. 前景與背景
    在 sh 下面,一個新產生的 process 可以經由 command 後面的符號';'和'&'來分
    別前景和背景。如以下語法
    
    command
    
      這表示產生一個 foreground 的 process ,你要等到它結束才能再下另一個指
      令。 
    
    command &
    
      這樣表示產生一個 background 的 process ,它會給你一個類似以下的訊息:
      
       [1] 21304
      
      然後就出現下一個提示號,以供你給下一個指令。然後在這個 background 的
      process 結束的時候再給你一個如下面的訊息,告訴你它把這個 process 執
      行完畢了。 
      
       [1]    Done                  command
        
    command1 ; command2 ; command3 
    
      這樣表示你要求系統連續執行 command1 , command2 , command3 三個指令,
      其中 command2 要等待 command1 , command3 要等待 command2 ,而你要等
      待 command3 執行完畢才能下指令。
      
    command1 & command2 & command3 &
    
      這樣表示你要求系統連續執行 command1 , command2 , command3 三個指令,
      而這三個指令都放在背景執行,彼此之間不需等待。
      
    fg 與 bg 
      
      也許你會問,一個已經執行的 process 可不可以由前景換背景,或由背景換
      前景呢?
      
      可以的。一個在前景執行的 process ,你可以按 Ctl-Z 將 process 暫停,
      系統會給你一個訊息:
      
      Suspended
      
      然後出現提示號。此時你可以使用 fg 將其恢復前景執行,或按 bg 將其改為
      背景執行。
      
      而如果有一個 background 的 process , 你也可以用 fg 指令將其呼叫到前景
      來。首先你需用 jobs 指令來觀查目前有多少在背景下的 proesses,然後根據
      它所顯示出來的 job id 來決定將那一個 process 放到前景。如使用
      
      	% fg %3 # 將第三個 job 放到 foreground 。
      
  4. 別名 alias
    在 csh 與 tcsh 中,提供 alias 的功能,使得使用者可以將常用卻冗長的
    指令以其他的名字存起,不過不須像儲存變數一樣要在前面加一個"$"。
    
    alias 的格式:
      alias  aliasname   string ....  
      alias  aliasname   'string \!* string' 
      
    前面的一個格式是把 aliasname 直接用來取代後面的 string ,然後如有任何
    跟在後面的 argument 將會出現的其後。如下例:
    
      % alias la ls -Fa
      
    例中的 la . 相當於 ls -F . ,然而如果僅是如此並不足夠,因此有後面的另
    一種格式。後面的格式中的 \!* 代表將來會出現在 aliasname 後面的所有參數,
    如下例:
    
      % alias dir 'ls -Flag \!* | more'
      
    例中的 dir doc 相當於 ls -Flag doc | more ,這樣可提供使用者在設計上更大
    的彈性。  
    
  5. tcsh 的初始設定檔
    tcsh 有兩個 initial 檔,一個是 $HOME/.tcshrc , 一個是 $HOME/.login 。
    
    每一個 tcsh 在被開啟時,它都會去執行所有位於 .tcshrc 中的命令,因此你
    可以把所有的 alias , 變數設定都放到 .tcshrc 裡面去。在tcsh 起動的時候
    便會自動的去執行這些對於你的環境的初始設定。
    
    .login 只有在 tcsh 本身是一個 login shell 的時候才會執行,它多半用來設
    定一些只需在 login 的時候要執行的命令,如環境變數的設定,因環境變數在
    設定之後,只要是其子 process 均會取得其環境,因此不須在每次開啟 shell 的
    時候都重覆執行。
    
    tcsh 另有一個結束設定檔,稱為 .logout ,是在每一個 login shell 結束,
    logout 所要執行的動作,其編輯的方法跟 .login , .tcshrc 完全一模一樣。
    
    source 指令
    
    如果要重新執行 .tcshrc 的內容,可以利用 source 指令來達到,此時就相
    當於把該檔案中的所有內容重新在命令列輸入一遍。如下:
    
      % source .login

.