Bash Shell 使用環境

  • 登錄訊息顯示資料
    1. 終端機介面 (tty1 ~ tty6) 登入提示字串
      [root@dywHome ~]# cat /etc/issue
      Mandriva Linux release 2007.0 (Official) for i586
      Kernel 2.6.17-5mdv on an i686 / \l
      
    2. issue 內的各代碼意義
      [root@dywHome ~]# man mingetty
      \d 本地端時間的日期;
      \l 顯示第幾個終端機介面;
      \m 顯示硬體的等級 (i386/i486/i586/i686...);
      \n 顯示主機的網路名稱;
      \o 顯示 domain name;
      \r 作業系統的版本 (相當於 uname -r)
      \t 顯示本地端的時間;
      \s 作業系統的名稱;
      \v 作業系統的版本。
      
    3. 使用者登入後取得的訊息在 /etc/motd。
      [root@linux ~]# vi /etc/motd
      Hello everyone,
      Our server will be maintained at 2005/10/10 0:00 ~ 24:00.
      Please don't login at that time. 
      
      # 使用者登入主機後,就會顯示這樣的訊息出來:
      
      Last login: Mon Aug 15 10:17:10 2005 from 127.0.0.1
      Hello everyone,
      Our server will be maintained at 2005/10/10 0:00 ~ 24:00.
      Please don't login at that time.
      
  • 環境設定檔
    1. 系統設定值
      1. /etc/profile
        1. 設定重要變數如:PATH、USER、MAIL、HOSTNAME、HISTSIZE、umask
        2. 規劃 /etc/inputrc 鍵盤熱鍵的設定;
      2. /etc/bashrc:規劃 umask 的功能,及提示字元 PS1 的內容。
      3. /etc/profile.d/:目錄裡的檔案針對 bash 及 C-shell 規範了一些資料。 例如 alias 規範值。
        [root@dywOffice ~]# ls /etc/profile.d/
        10lang.csh*              inputrc.csh*    numlock.sh*
        10lang.sh*               inputrc.sh*     python.csh*
        10mandriva-release.csh*  kde3.sh*        python.sh*
        10mandriva-release.sh*   less.csh*       qtdir3.csh*
        alias.csh*               less.sh*        qtdir3.sh*
        alias.sh*                mc.csh*         screen.sh*
        configure_keyboard.sh*   mc.sh*          ssh-client.sh*
        gconf.csh*               menustyle.csh*  tmpdir.csh*
        gconf.sh*                menustyle.sh*   tmpdir.sh*
        glib20.csh*              msec.csh*       xhost.csh*
        glib20.sh*               msec.sh*        xhost.sh*
        
      4. /etc/man.config:規定下達指令 man 之設定,例如:變數 MANPATH 規定 man page 時,會依據 MANPATH 的路徑分別搜尋。
    2. 個人設定值:在個人家目錄的幾個隱藏檔當中,需要使用 ls -al 方能顯示。
      [dywang@dywHome ~]$ ls -ald ~/.bash*
      -rw------- 1 dywang users 552 Feb  6 13:07 /home/dywang/.bash_history
      -rw-r--r-- 1 dywang users  24 Dec  3 06:04 /home/dywang/.bash_logout
      -rw-r--r-- 1 dywang users 376 Dec  3 06:04 /home/dywang/.bash_profile
      -rw-r--r-- 1 dywang users 124 Dec  3 06:04 /home/dywang/.bashrc
      
    3. 登入 bash 時如何讀取設定檔?
      1. 先讀取 /etc/profile,再根據 /etc/profile 的內容去讀取其他額外的設定檔,例如 /etc/profile.d/etc/inputrc 等等設定檔;
      2. 根據不同的使用者,到使用者家目錄去讀取 ~/.bash_profile~/.bash_login~/.profile 等設定檔;
      3. 根據不同使用者,到他家目錄去讀取 ~/.bashrc
    4. 登入 bash 後,最終讀取的設定檔是 ~/.bashrc,故只要將自己喜好的設定寫入該檔,不論原來系統做了什麼設定值,都可以使用屬於自己熟悉的環境。
    5. 修改完設定檔,logout 後再重新 login 到 bash 內,就能夠將環境設定檔重讀。不過,亦可使用底下的方式來讓該設定檔立即生效:
      [root@linux ~]# source file
      #範例:
      [root@linux ~]# source ~/.bashrc
      [root@linux ~]#  .  ~/.bashrc
      #利用 source 或小數點 (.) 都可以將設定檔的內容讀進來目前的 shell 環境中。
      
    6. login shell 與 non-login shell
      1. 使用者登入 Linux 系統時,所取得的環境設定檔稱為 login shell。
      2. 登入後,啟動其他的 bash 時所取用的環境設定檔稱為 non-login shell。
      3. 在 X 環境下所啟動的終端機 (shell),那些 shell 所使用的環境設定檔都是 non-login shell。
      4. login shell會讀取 ~/.bash_profile, ~/.bash_login, ~/.profile 這三個檔案其優先順序如上述。
      5. non-login shell 讀取的就僅有 ~/.bashrc
  • 終端機的環境設定
    1. 查閱終端機的輸入按鍵
      [root@linux ~]# stty [-a]
      選項:
      -a  :將目前所有的 stty 參數列出來;
      #範例:
      #範例一:列出所有的按鍵與按鍵內容
      [root@linux ~]# stty -a
      speed 38400 baud; rows 40; columns 80; line = 0;
      intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; 
      eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase 
      = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
      -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
      -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl 
      ixon -ixoff -iuclc -ixany -imaxbel opost -olcuc -ocrnl onlcr -onocr 
      -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten 
      echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
      
    2. stty -a 重要意義:
      eof   : End of file ,代表『結束輸入』。 
      erase : 向後刪除字元, 
      intr  : 送出一個 interrupt (中斷) 的訊號給目前正在 run 的程序; 
      kill  : 刪除在目前指令列上的所有文字; 
      quit  : 送出一個 quit 的訊號給目前正在 run 的程序; 
      start : 在某個程序停止後,重新啟動他的 output 
      stop  : 停止目前螢幕的輸出; 
      susp  : 送出一個 terminal stop 的訊號給正在 run 的程序。
      
    3. 設定終端機的輸入按鍵
      [root@linux ~]# stty erase ^h   %*<==用 [ctrl]+h 來進行字元的刪除*)
      
    4. 利用 set 顯示變數及設定指令輸出/輸入的環境
      [root@linux ~]# set [-uvCHhmBx]
      選項:
      -u  :預設不啟用。若啟用後,當使用未設定變數時,會顯示錯誤訊息;
      -v  :預設不啟用。若啟用後,在訊息被輸出前,會先顯示訊息的原始內容;
      -x  :預設不啟用。若啟用後,在指令被執行前,會顯示指令內容(前面有 ++ 符號)
      -h  :預設啟用。與歷史命令有關;
      -H  :預設啟用。與歷史命令有關;
      -m  :預設啟用。與工作管理有關;
      -B  :預設啟用。與刮號 [ ] 的作用有關;
      -C  :預設不啟用。若使用 >  等,則若檔案存在時,該檔案不會被覆蓋。
      #範例:
      #範例一:顯示目前所有的 set 設定值
      [root@linux ~]# echo $-
      himBH
      # 那個 $- 變數內容就是 set 的所有設定。 bash 預設是 himBH。
      
      #範例二:設定 "若使用未定義變數時,則顯示錯誤訊息" 
      [root@linux ~]# set -u
      [root@linux ~]# echo $vbirding
      -bash: vbirding: unbound variable
      # 預設情況下,未設定/未宣告 的變數都會是『空的』,不過,若設定 -u 參數,
      # 那麼當使用未設定的變數時,就會有問題。很多的 shell 都預設啟用 -u 參數。
      # 若要取消這個參數,輸入 set +u 即可。
      
      #範例三:執行前,顯示該指令內容。
      [root@linux ~]# set -x
      [root@linux ~]# echo $HOME
      + echo /root
      /root
      ++ echo -ne '\033]0;root@linux:~\007'
      # 要輸出的指令都會先被列印到螢幕上。前面會多出 + 的符號。
      
    5. /etc/inputrc 按鍵設定功能
      [root@linux ~]# cat /etc/inputrc
      # do not bell on tab-completion
      #set bell-style none
      
      set meta-flag on
      set input-meta on
      set convert-meta off
      set output-meta on
      .....以下省略.....
      
    6. 其他與終端機有關的環境設定檔案 /etc/DIR_COLORS*/etc/termcap
    7. 不建議修改 tty 的環境,但要知道終端機是如何進行設定。
  • 萬用字元與特殊符號
    1. 符號與代表意義對照表
      符號 內容
      * 萬用字元,代表 0 個或多個字元(或數字)
      ? 萬用字元,代表『一定有』一個字母
      # 註解,這個最常被使用在 script 當中,視為說明。
      \ 跳脫符號,將『特殊字元或萬用字元』還原成一般字元
      ; 連續性命令的界定(注意。與管線命令並不相同)
      ~ 使用者的家目錄
      / 路徑分隔的符號
      $ 亦即是變數之前需要加的變數取代值
      ' 單引號,不具有變數置換的功能
      " 雙引號,具有變數置換的功能。
      ` ` 兩個『 ` 』中間為可以先執行的指令。
      & 將指令變成背景下工作
      [ ] 在中間為字元的組合
      ! 邏輯運算意義上的『非』 not 。
      >, >> 輸出導向,分別是『取代』與『累加』
      ( ) 在中間為子 shell 的起始與結束
      { } 在中間為命令區塊的組合。
      $\vert$...
...$\vert$ 分隔兩個管線命令的界定;
      組合按鍵 執行結果
      Ctrl + C 終止目前的命令
      Ctrl + D 輸入結束(EOF),例如郵件結束的時候;
      Ctrl + M 就是 Enter 。
      Ctrl + S 暫停螢幕的輸出
      Ctrl + Q 恢復螢幕的輸出
      Ctrl + U 在提示字元下,將整列命令刪除
      Ctrl + Z 『暫停』目前的命令
    2. 使用符號 *, ?, #
      [root@dywOffice ~]# ls test*      %*<== * 代表後面不論接幾個字元都予以接受*)
      [root@dywOffice ~]# ls test?      %*<== ? 代表後面『一定』要接『一個』字元*)
      [root@dywOffice ~]# ls test???    %*<== ??? 代表『一定要接三個』字元。*)
      [root@dywOffice ~]# ls \#list directory contents %*<== \# 接註解*)
      core.29348  core.29456  Download/  histfiles  Pictures/  tmp/  Video/
      core.29452  Documents/  drakx/     Music/     presets/   usretc.k3b
      
    3. 使用跳脫符號 \
      [root@dywOffice ~]# touch a\ b   %*<== \ 跳脫空字元*)
      [root@dywOffice ~]# ls a*
      -rw-r--r-- 1 root root 0 Jan 31 14:33 a b
      [root@dywOffice ~]# touch a\ c; ll a* %*<== ; 連續執行兩指令*)
      -rw-r--r-- 1 root root 0 Jan 31 14:33 a b
      -rw-r--r-- 1 root root 0 Jan 31 14:34 a c
      
    4. 使用家目錄符號 ~
      [root@dywOffice ~]# cd ~/Documents/  %*<== ~ 表家目錄, / 表路徑分隔*)
      [root@dywOffice Documents]# cd  %*<== 回到家目錄,與 cd ~ 相同*)
      
    5. 使用符號 ' '" "
      [root@dywOffice ~]# name=csie   %*<== 設定變數 name *)
      [root@dywOffice ~]# echo $name  %*<== 以 \$ 取變數內容*)
      csie
      [root@dywOffice ~]# echo '$name' %*<== ' ' 單引號,不具有變數置換的功能*)
      $name
      [root@dywOffice ~]# echo "$name" %*<== " " 雙引號,具有變數置換的功能*)
      csie
      
    6. 使用符號 ` `:被 ` ` 括起來的內容『會先執行』
      [root@dywOffice ~]# ls /lib/modules/`uname -r`/kernel/drivers
      acpi/       crypto/      input/    net/      telephony/
      atm/        edac/        isdn/     parport/  usb/
      block/      firmware/    md/       pci/      video/
      bluetooth/  hwmon/       media/    pcmcia/   w1/
      cdrom/      i2c/         message/  rtc/
      char/       ide/         misc/     scsi/
      connector/  ieee1394/    mmc/      serial/
      cpufreq/    infiniband/  mtd/      spi/
      
    7. 使用符號 &
      [root@dywOffice ~]# vi a\ b &  %*<== \& 背景執行*)
      [1] 24034
      [root@dywOffice ~]# jobs
      [1]+  Stopped                 vi a\ b
      [root@dywOffice ~]# fg 1  %*<== 到前景執行後,退出*)
      vi a\ b
      [root@dywOffice ~]# jobs
      
    8. 使用符號 [ ]!
      [root@dywOffice ~]# cp test[1-5] /tmp
      # 將 test1, test2, test3, test4, test5 若存在的話,就拷貝到 /tmp 
      [root@dywOffice ~]# cp test[!1-5] /tmp
      # 只要不是 test1, test2, test3, test4, test5 之外的其他 test? ,
      # 若存在的話,就拷貝到 /tmp
      

練習題

  1. 終端機介面 (tty1 ~ tty6) 登入提示字串,存在那個檔案?
    Sol. /etc/issue
  2. 終端機介面登入提示字串,代碼 \d 代表意義為何?
    Sol. 本地端時間的日期
  3. 終端機介面登入提示字串,代碼 \l 代表意義為何?
    Sol. 顯示第幾個終端機介面
  4. 終端機介面登入提示字串,代碼 \m 代表意義為何?
    Sol. 顯示硬體的等級 (i386/i486/i586/i686...)
  5. 終端機介面登入提示字串,代碼 \n 代表意義為何?
    Sol. 顯示主機的網路名稱
  6. 終端機介面登入提示字串,代碼 \o 代表意義為何?
    Sol. 顯示 domain name
  7. 終端機介面登入提示字串,代碼 \r 代表意義為何?
    Sol. 作業系統的版本 (相當於 uname -r)
  8. 終端機介面登入提示字串,代碼 \t 代表意義為何?
    Sol. 顯示本地端的時間
  9. 終端機介面登入提示字串,代碼 \s 代表意義為何?
    Sol. 作業系統的名稱
  10. 終端機介面登入提示字串,代碼 \v 代表意義為何?
    Sol. 作業系統的版本
  11. 使用者登入 bash shell 後取得的訊息,存在那個檔案?
    Sol. /etc/motd
  12. 使用者登入 bash shell 時,要讀取那些系統設定檔?
    Sol. /etc/profile, /etc/bashrc, /etc/profile.d 目錄裡的檔案, /etc/man.config
  13. 使用者登入 bash shell 時,要讀取那些個人設定檔?
    Sol. ~/.bash_profile, ~/.bashrc
  14. 登入 bash 後,最終讀取的設定檔是那個設定檔,故只要將喜好的設定寫入該檔,不論原系統做什麼設定,都可以使用自己熟悉的環境?
    Sol. ~/.bashrc
  15. 使用者修改 bash 設定檔後,如何在不重新登入的情況下,使用這些設定?
    Sol. 執行 source ~/.bashrc. ~/.bashrc
  16. 何謂 login shell 與 non-login shell?
    Sol. 使用者登入 Linux 系統時,所取得的環境設定檔稱為 login shell。 登入後,啟動其他的 bash 或在 X 環境下所啟動的終端機,所取用的環境設定檔稱為 non-login shell。
  17. 登入 non-login shell,僅會讀取那個設定檔?
    Sol. ~/.bashrc
  18. 如何查閱 bash 終端機的輸入按鍵?
    Sol. stty -a
  19. 查閱 bash 終端機的輸入按鍵,顯示 eof = ^D,代表意義為何?
    Sol. 按 [Ctrl]+d 結束輸入
  20. 查閱 bash 終端機的輸入按鍵,顯示 earse = ^?,代表意義為何?
    Sol. 按 [Ctrl]+? 向後刪除字元
  21. 查閱 bash 終端機的輸入按鍵,顯示 intr = ^C,代表意義為何?
    Sol. 按 [Ctrl]+C 送出一個 interrupt (中斷) 的訊號給目前正在 run 的程序
  22. 查閱 bash 終端機的輸入按鍵,顯示 kill = ^U,代表意義為何?
    Sol. 按 [Ctrl]+U 送出一個 quit 的訊號給目前正在 run 的程序
  23. 查閱 bash 終端機的輸入按鍵,顯示 start = ^Q,代表意義為何?
    Sol. 按 [Ctrl]+Q 在某個程序停止後,重新啟動他的 output
  24. 查閱 bash 終端機的輸入按鍵,顯示 stop = ^S,代表意義為何?
    Sol. 按 [Ctrl]+S 停止目前螢幕的輸出
  25. 查閱 bash 終端機的輸入按鍵,顯示 susp = ^Z,代表意義為何?
    Sol. 按 [Ctrl]+Z 送出一個 terminal stop 的訊號給正在 run 的程序
  26. 如何設定 bash 終端機的輸入按鍵,按 [ctrl]+h 來進行字元的刪除?
    Sol. stty erase ^h
  27. 如何設定 bash 終端機的輸入按鍵,按 [ctrl]+e 來結束輸入?
    Sol. stty eof ^e
  28. 如何設定 bash,若使用未定義變數時,則顯示錯誤訊息?
    Sol. set -u
  29. 如何取消 bash,若使用未定義變數時,則顯示錯誤訊息的設定?
    Sol. set +u
  30. 如何設定 bash,於執行前顯示該指令內容?
    Sol. set -x
  31. bash 終端機的按鍵設定功能,存在那個檔案?
    Sol. /etc/inputrc
  32. 請說明指令 ls test* 之意義?
    Sol. 列出以 test 開頭之所有檔案或目錄
  33. 請說明指令 ls test? 之意義?
    Sol. 列出以 test 開頭後接『正好一個字元』之所有檔案或目錄
  34. 請說明指令 ls #list directory contents 之意義?
    Sol. 列出檔案或目錄 # 接註解,無關指令之執行
  35. 請說明指令 touch a\ b 之意義?
    Sol. 產生一個檔名為 a b 的空檔案,a 與 b 中間之空字元必須以 \ 符號跳脫
  36. 請說明指令 touch a\ b; ll a* 中『;』之意義?
    Sol. 『;』使兩指令連續執行
  37. 請說明指令 cd ~/Documents/ 之意義?
    Sol. 改變目錄到家目錄下的 Documents 次目錄
  38. 請說明指令 echo $name 之意義?
    Sol. 回應變數 name 的內容
  39. 請說明指令 echo '$name' 之意義?
    Sol. 回應字串 $name ,' ' 不具有變數置換的功能,故不取變數 name 的內容
  40. 請說明指令 echo "$name" 之意義?
    Sol. 回應變數 name 的內容," " 具有變數置換的功能
  41. 請說明指令 ls /lib/modules/`uname -r`/kernel/drivers 中『“』之意義?
    Sol. 『“』使指令 uname -r 先執行
  42. 請說明指令 vi ab.txt & 中『&』之意義?
    Sol. &』使指令 vi ab.txt 在背景執行
  43. 請說明指令 cp test[1-3] /tmp 之意義?
    Sol. 將 test1, test2, test3,複製到 /tmp
  44. 請說明指令 cp test[!1-3] /tmp 之意義?
    Sol. 將非 test1, test2, test3 之其他 test 開頭的檔案複製到 /tmp
  45. 在 bash 環境下,按下 [Ctrl]+C,預設代表什麼意義?
    Sol. 終止目前的命令
  46. 在 bash 環境下,按下 [Ctrl]+D,預設代表什麼意義?
    Sol. 輸入結束(EOF)
  47. 在 bash 環境下,按下 [Ctrl]+M,預設代表什麼意義?
    Sol. 就是 [Enter]
  48. 在 bash 環境下,按下 [Ctrl]+S,預設代表什麼意義?
    Sol. 暫停螢幕的輸出
  49. 在 bash 環境下,按下 [Ctrl]+Q,預設代表什麼意義?
    Sol. 恢復螢幕的輸出
  50. 在 bash 環境下,按下 [Ctrl]+U,預設代表什麼意義?
    Sol. 在提示字元下,將整列命令刪除
  51. 在 bash 環境下,按下 [Ctrl]+Z,預設代表什麼意義?
    Sol. 『暫停』目前的命令

  DYWANG_HOME