標  題: 功能強大的 UNIX Shell -- tcsh 簡介 
 
=== == === == === == === == === == === == === == === == === == === == === == 
: 交大計中通訊 77 期 (82.4.) 有篇「功能強大的 UNIX Shell--tcsh 簡介」。
: 由 is81026@cis.nctu.edu.tw 所寫。
轉載於下....
 
           功能強大的 UNIX Shell -- tcsh 簡介
                                                       /江海瑜
 
 
          Shell,所謂的『命令解譯器』,提供使用者和UNIX系統核心溝通的介面程式。
    一個實用而又友善的Shell能夠讓使用者使用起來得心應手,tcsh就是這樣一個功能
 強大而又比較友善的介面程式,尤其從DOS剛進入到UNIX的使用者而言更是如此。因
    為tcsh不但具有csh所有的功能外,更有命令列編修、DOSKEY、命令或檔案之完成與
    搜尋等許多功能,對於慣用DOS的使用者而言,無疑是一大福音,而對原來使用csh 的
    使用者來說更是如虎添翼,但是有許多人對於tcsh的功能不甚瞭解,抑或是根本不知
    道tcsh的存在,因此我將使用tcsh的經驗與大家一起分享,希望大家能夠多利用tcsh
    的功能,使得使用UNIX成為一件快樂的事。
 
          tcsh提供了很多新功能,不及備載。以下我將選擇幾項重要而又實用的功能
    與大家共同分享:
 
    1.DOSKEY(Visual History)
      可由上下左右四個方向鍵,觀看history list中之命令並可加以修改或執行。
      例如:
        >ls -F
        braver   dragonhose   ryo   tintin*
        >echo "I am Fish!"
        I am Fish!
        >[↑]echo "I am Fish!"
 
    ※[↑]表示按下方向鍵 ,以下用中括號括起來皆表示按下一個按鍵,例如: [TAB],
      [ESC],而^表示按著CTRL(Control)鍵不放,再按其它鍵,例: [^D]表示按著CTRL
      鍵不放,再按d。
      >ls -F
      按一下 鍵,再鍵入l,按[ENTER]
      -rw-------  1 is81026      362 Apr 20 20:01 barver
      -rw-------  1 is81026      434 Apr 20 20:01 dragonhorse
      -rw-------  1 is81026      341 Apr 20 20:01 ryo
      -rwx------  1 is81026      362 Apr 20 20:01 tintin
 
    2.完成命令或檔名(Word Completion)
      在輸入命令或檔案時,不需輸入完整之命令或檔名,只需輸入命令或檔案之部份字元
      ,然後按[TAB],tcsh將會試圖找出一個唯一符合你輸入字元的命令或檔案並幫你完
      成它。若有數個符合的命令或檔案時,tcsh將會幫你完成至這些命令或檔案的共同
      部份,並發出『畢』的一聲警告你,並等待你輸入下一個識別字元。
      例如:目前目錄下包含下列檔案:
        Makefile        bin       cmd       lib       memos
        Makefile.old    chaos.c   cmtest    mail      networks
        bench.c         class     dev       mbox      socket.c
        鍵入下列命令:
        >vi n[TAB]
        則會出現
        >vi networks   確定之後,按[ENTER]
        因為只有networks符合第一個字母為n之條件,所以tcsh自動幫你找到並完成它。
        如果鍵入下列命令:
        >vi M[TAB]
        則會出現
        >vi Makefile
        並出現"畢"一聲,警告你有兩個以上的檔案符合,並等待你確定或輸入下一個辨
        識字元再按[ENTER],以便尋找你想要的檔案。
        >vi Makefile.[TAB]
        >vi Makefile.old
      命令亦可,例如:
        >unc[TAB]
        >uncompress
      要控制tcsh完成檔名或命令的動作,可以藉著設定以下幾個shell變數來完成:
      (1) recexact:
          這個變數是用來使精確的檔案或命令被擴展,而不發出警告聲。
          例如:
          假設目前目錄下有兩個子目錄,foo與food,而且recexact這個變數已被設定,
          >cd fo[TAB]
          >cd foo[TAB]
          >cd foo/
          第一次按下[TAB]時,tcsh將其擴展成foo並發出警告聲,但第二次再按下[TAB]
          時,tcsh會將其擴展成foo/這個子目錄,而不會發出警告聲。
          例如: >set recexact
      (2) autolist:
          當這個變數被設定,而如果有數個檔案或命令部份符合時,tcsh會將這幾個選擇
          列出,再供你選擇。類似按下Ctrl-D,請參考下一個功能說明。
          例如: >set autolist
      (3) matchbeep:
          這個變數是用來控制何時發出警告聲,也就是『畢』的一聲,它具有下列幾個值
          可供設定:
          nomatch: 為找出符合的檔案或命令時,發出警告聲。
          ambiguous: 有很多檔案或命令符合時,發出警告聲。
          notunique: 找到一精確符合的,但還有其他較長而且符合的檔名或命令時,發出
                     警告聲。
          never: 無論在任何情況下都不發出警告聲。
          例如: >set matchbeep=nomatch
      (4) autoexpand:
          根據使用者鍵入的字元,自動參考history list的命令,尋找並將其擴展成第一
          個符合的命令。
          例如: >set autoexpand
      (5) autocorrect:
          如果這個變數被設定,tcsh會根據可能之檔案路徑,替你更正可能的錯誤。
          例如: >set autocorrect
 
    3.命令或檔案之搜尋(List Possible Word)
      列出前幾個字元符合你所鍵入字元的命令或檔案。
      例如:
      (1) 目前目錄下之檔案與2.相同
          >vi c[^D]
          chaos.c     class      cmd*     cmtest/
          按下[^D]後,tcsh會列出所有c 開頭的檔案。
          檔案後之特殊符號分別表示各種性質不同的檔案:
          /  -> 目錄(Directory)           |  -> 序列(Queue)
          *  -> 執行檔(Executable file)   %  -> 字元設備檔(Character Device)
          @  -> Symbolic link             #  -> 區塊設備檔(Block Device)
          =  -> Socket
      (2) >b[^D]
          b2g         bbfig       beach-ball2    biff             bitmap
          bar         bc          bg             bind             bmtoa
          basename    bdftopcf    bggen          bindkey          break
          bash        bdftops     bgplot         bindkey-command  breaksw
          batch       beach-ball  bibtex         bison            builtins
          將會列出所有以b 開頭的命令及目前目錄下以b 開頭的檔案。
      (3) >~[^D]
          將會列出目前系統所有的帳號(login name)。
      (4) >cd /usr/op[^D]
          >cd /usr/openwin/
          將會列出符合之路徑。
 
    4.命令列編修(Command Line Editing)
      tcsh提供類似GNU Emacs或VI的控制鍵來修改目前命令列之命令,其預設值為使用
      GNU Emacs的控制鍵,但是使用者可利用bindkey命令將控制鍵改為VI模式,或是依
      各人之喜好定義出自己認為方便的控制鍵。
      關於 GNU Emacs 與 VI之控制鍵定義請查相關資料。
 
      * 定義自己的控制鍵
          使用者可利用bindkey命令,來定義自己需要或慣用的控制鍵,或是將某個按鍵
          定義成常用的UNIX命令,甚至連使用者常用的字串亦可定義。
          語法: bindkey [-a] [-c] [-s] [-v] [-e] [-d] [-k] [-l] [-r] [--]
                        [[in-string | key-name][out-string | command]]
          說明: -a :
                -s : 指定輸出用某一字串取代,而非執行tcsh所提供之控制命令,類
                     似alias的功能。
                -c : 指定輸出用某一UNIX命令取代並加以執行。
                -v : 將控制鍵命令對照方式設為VI模式。
                -e : 將控制鍵命令對照方式設為Emacs模式。
                -k :
                -d :
                -l : 列出可指定之控制命令。
                -r : 將某一已定義之控制鍵移去。
          例如:
            >bindkey "[HOME]" beginning-of-line
            將[HOME]這個鍵定義為移至一行之開頭,以後當你在做命令列編修時,按下
            [HOME],游標就會移至該命令列之開頭。
 
            >bindkey -r "[HOME]"
            將[HOME]這個鍵的定義移去。
            >bindkey -s "^F" I_am_Fish!
            將Ctrl-F定義為I_am_Fish!這個字串,當你按下該鍵時,螢幕上會顯示出
            I_am_Fish!這個字串。
 
            >bindkey -s "^X" ls -alF
            將Ctrl-F定義為執行ls -alF這個UNIX命令。
 
 
    5.週期性命令之執行(Periodic Command Execution)
      藉著設定shell變數tperiod與代名(alias)periodic,可執行週期性之命令。
      語法: set tperiod=
            alias periodic 
      說明:  時間間隔,以分鐘為單位。
               欲執行之命令。
      例如:
      >set tperiod=30
      >alias periodic checknews
      tcsh將會每隔30分鐘執行checknews這個命令一次。
 
    6.時間性事件列表(Timed Event List)
      tcsh提供了一個命令sched,讓你能在每天特定的時間執行某個命令,其功能類似
      UNIX上原有之crontab的功能。
      語法: (1)sched [+]hh:mm 
            (2)sched
            (3)sched -
      說明: (1)[+]hh:mm   欲執行命令之時間,+表示過了中午12:00,或可利用'am'或
                          'pm'來指定,例如:8:00表示早上8:00,亦可用8:00am來表示,
                          而+3:30表示下午3:30,亦可用3:30pm來表示。
                 欲執行之命令。
            (2)不加任何參數,則列出已指定時間之命令。
            (3)用以去除某一已設定之命令,表示該命令在list中之編號。
      例如:
      (1)>sched 11:50 echo It\'s time to eat lunch.
         >sched 5pm set prompt='[%h] It\'s after 5; go home: >'
         於早上11:50在螢幕上印出It's time to eat lunch.,而在下午5:00時,將提示
         符號(prompt)改為[26] It's after; go home: >,26是該命令history list中
         的號碼。
      (2)>sched
             1  Wed Apr  4 15:42  /usr/lib/uucp/uucico -r1 -sother
             2  Wed Apr  4 17:00 set prompt=[%h] It's after 5; go home: >
         >
         將會列出目前所有以設定時間與命令的對照表。
      (3)>sched -3
         Not that many scheduled events.
         >sched -2
         >sched
             1  Wed Apr  4 15:42  /usr/lib/uucp/uucico -r1 -sother
         >
         將scheduled list的第二項移去。
 
    7.自動斷線或鎖住螢幕(Automatic Logout/Locking)
      當你忘記logout或idle太久時,tcsh會根據你所設定的時間替你logout或lock你的
      螢幕,使你的檔案不會被其他的人竄改或刪除。設定的方法是利用變數autologout
      來設定你所希望logout或lock螢幕的時間。
      語法: set autologout=
            set autologout=( )
      說明:  希望idle幾分鐘之後自動logout,預設值為60分鐘。
               希望idle幾分鐘之後自動lock,無預設值。
      例如:
      (1)>set autologout=30
         tcsh會在你idle30分鐘後顯示auto-logout並自動幫你logout。
      (2)>set autologout=(20 3)
         除了在你idle20分鐘後,tcsh自動幫你logout之外,你每idle3分鐘,tcsh會將螢幕
         lock住,並詢問你密碼,在密碼輸入錯誤五次之後,tcsh會自動幫你logout,以保護
         你寶貴的資料。
 
    8.觀看上線狀況(Watching for Logins and Logouts)
      有的人每次上線時,都會利用rusers或who指令來觀看是否有認識的人在線上,然後
      再予他(她)交談(talk),但一直用rusers或who來看似乎有點麻煩,現在這些人有福
      了,因為tcsh提供了可以讓你每幾分鐘就知道他(她)是否已經上線的功能。這個功
      能是利用設定特殊的shell變數來達成的。
      語法: set watch=(     ....)
      說明:  時間間隔,以分鐘為單位,省略時,預設值為10分鐘。
                 使用者帳號。
              使用者所在的終端機。
            此外,還有一特殊的字'any',可用來指定所有的使用者或終端機。
      例如:
      (1) >set watch=(sys ttyp0 root console)
          tcsh會向使用者通知在終端機/dev/ttyp0上是否有sys login或logout,還有主
          控台(console)上是否有root login或logout。
      (2) >set watch=('b*' any any ttyp5)
          tcsh會向使用者通知在這部機器的任一個終端機上是否有以b為開頭的帳號
          login或logout,還有在終端機/dev/ttyp5上是否有任何一個使用者login或
          logout。
      (3) >set watch=(any any)
          tcsh會向使用者通知在這部機器的任一個終端機上是否有任何一個使用者
          login或logout。
      (4) >set watch=(40 any any)
          每隔40分鐘,tcsh會向使用者通知在這部機器的任一個終端機上是否有任何一
          個使用者login或logout。
 
    9.新提示符號格式(New Prompt Format)
      在設定提示符號方面,tcsh利用"%"定義了許多新的格式,例如:時間、所在目
      錄等。類似C語言中printf函數的用法。這些符號的意義請利用 man 命令查詢。
 
      範例:
      >set prompt="%m [%h] %U[%@]%u [%/] you rang? "
      cissun10 [26] [11:35pm] [/usr/accts/sys] you rang? _
 
 
後記: 本人才疏學淺,文中若有任何錯誤,請各位不吝賜教。
      E-mail Address: is81026@cis.nctu.edu.tw 資訊科學系 江海瑜
 
=== == === == === == === == === == === == === == === == === == === == === == 
 
發信人: alva@cis_nctu (al), 信區: Unix
標  題: Re: 請問有沒有人用過 tcsh ?
發信站: 交大資科系_BBS (Oct 11 22:51:20 1993)
轉信站: cis_nctu
 
==>[Author]: "jsshue" on board 'Unix'
> :       似乎沒看過有人討論 tcsh ?
> :       請問有沒有人用過這個 shell ?
> :       可否描述一下這 shell 的特點,
> :       值不值得為之捨棄 csh 呢 ?
 .. 
> 以使用而言,tcsh 很方便!!但寫shell script 就比不上 sh 啦!!
> 但csh 和 tcsh 都很相c的語法,看看就會寫tcsh shell script 了!!
> sh則是普遍性與shell script 的能力優於tcsh&csh!!
 
  UNIX 的 shell 有兩大主流, 一 為 Bourne shell: 
/bin/sh  一為 csh  /bin/csh. 此二 shells 已老邁,
但極有權威. 分別繁衍不少後代. 但 sh 的子孫似較多.
如 ksh, zsh, bash, 皆很活躍. 而 csh 之後代似僅 
tcsh 較著名. 名著 "Life with UNIX" 作者Don Libes 提起
說, "有很多人兩類shell都用. 用sh寫script, 用csh做
interactive shell." "csh號稱模倣C語言, 可是寫
script 的人[他們當然大都都是 C 的行家], 往往覺
得還是 sh 好用"
 
  tcsh 是 csh 的 superset. 有 tcsh 可用, 當然改用
tcsh. 如果是習慣 sh 的人, 可以改用 GNU 的好東西
bash (Bourne again shell). 完全不用任何設定就有 doskey
那種功能了. 多愉快. 還有種種奇妙功能, 說之不盡.
(man page 共 2451 頁!)
 
  但Internet 上送 shell script 給人用絕大多數仍用 sh 
寫. 正是著眼於其最普遍, 為UNIX世界任何機器上之絕對
存在物. 
  
  還沒開始玩 UNIX, 就會 C 了. 但玩 UNIX 至今仍 
一直親近 sh 家族的人. 因為我是玩 Linux 才對 UNIX
發生真正的興趣的. (可以過過小小 super user 的癮),
而Linux上的標準shell 正是 bash. 再加上後來讀了經典
K&P 的 The Unix Programming Environment 書雖老, 其啟發性
卻歷久彌新. 他的 script 都是用sh寫的.
 
  又: 寫 GNU 的軟体的高手們真是一群大好人. 大家多多支持.
他們的軟体非常好用. 可至 ftp.edu.tw  UNIX/GNU 看看.
 
=== == === == === == === == === == === == === == === == === == === == === ==