歡迎您光臨本站 註冊首頁

對話 UNIX: 從簡單的按鍵操作學起

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

用戶與計算機交互的方式在不斷發生變化.啟動后提供純命令行界面的操作系統已逐漸演化為圖形化前端.但是,脫離構成操作系統的構建塊有時並非是邁向正確方向的必要步驟.IBM? AIX? 操作系統一直把握著重點:穩定性、功能和穩健性.它通過保留強大的命令行界面 (CLI) 來實現這一目標.如果您未曾學習如何使用 CLI 或需要複習 CLI 的基礎知識,請繼續往下閱讀.

  用戶與計算機交互的方式在不斷發生變化.啟動后提供純命令行界面的操作系統已逐漸演化為圖形化前端.然而,脫離構成操作系統的構建塊有時並非是邁向正確方向的必要步驟.向圖形化用戶界面 (GUI) 過渡往往意味著損失功能;而且,用戶漸漸傾向於不願詳細了解他們所使用的計算機.幸運的是,與其他 UNIX? 和 Linux? 系統類似,AIX 操作系統一直把握著重點:計算機操作系統的穩定性、功能和穩健性.

  大量 UNIX 和 Linux 供應商已充分認識到操作系統的 CLI 的重要性.但是,出於自動化、降低用戶使用計算機的難度或其他原因,用戶已忘記或從未了解 CLI 的細節.本文向新用戶和已經遺忘細節的用戶介紹 CLI,以幫助他們記住或回想起 CLI 對於管理、開發和常規 UNIX 計算之重要的原因.

  什麼是命令行?
  在計算機上工作時,了解實際使用的工具非常重要.如果您曾經使用過 UNIX 或 Linux,那麼您應該聽說過術語 shell 或 命令行.這兩個術語可以作為同義詞使用,並且指的是用戶正在運行的實際 UNIX shell.UNIX 中的術語 shell 指的是您在鍵入命令或執行功能時所使用的介面.

  當用戶通過控制台或網路登錄 UNIX 系統時,將調用可定義 shell(位於 /etc/passwd),並通過配置文件設置用戶環境(本文稍後將進行說明),於是用戶準備好在 shell 中執行操作.當用戶在命令行(即用戶正在使用的 shell)中鍵入命令時,用戶只能看到 stdin(即標準輸入),這是用戶或程序提供的輸入.當用戶按 Enter 或 Return 鍵時,通過 shell 發送 stdin 以執行命令,然後用戶可能收到 stdout(即標準輸出)和 stderr(即標準錯誤),具體取決於輸出重定向的方式(例如,重定向到用戶的顯示器、文件或印表機).術語 stdout 表示執行的程序所返回的輸出數據,而 stderr 指的是程序遇到或返回的錯誤.用戶不會看到處理單個或多個命令的所有底層代碼的執行情況,而是看到非常簡單化的輸入、輸出和錯誤.由於上述原因,用戶登錄時調用的程序被恰當地稱為 shell,它隱藏了操作系統的所有底層調用.

  shell 的歷史
  UNIX shell 至今存在的時間已超過 35 年,它現在仍然在發展壯大!它創始於 1971 年,這一年 AT&T 貝爾實驗室的 Ken Thompson 創建了第一個 UNIX shell,它具有貼切的名稱 Thompson shell.雖然 Thompson shell 缺少人們日常使用的 UNIX 所具備的一些重要內置功能,如管道 (|)、編寫 shell 腳本的能力和 if 條件語句,但是該 shell 的基礎功能(如數據重定向)仍存在於現今使用的 shell 中.


  後來,在 1997 年,Thompson shell 被 Bourne shell(即 sh)所取代.Bourne shell 是由 AT&T 貝爾實驗室的 Stephen Bourne 創建的,它成為 UNIX 第 7 版 (V7) 的預設 shell.Bourne shell 使 UNIX 的發展向前邁進了一大步.到這時,用戶可以編寫 shell 腳本,在變數中存儲信息和導出信息,控制文件描述符,控制信號處理,使用 for 循環和 case 語句,以及其他大量功能.雖然 Bourne shell 創建至今已有 30 多年時間,目前它仍在大量的 UNIX 系統中廣為使用,並且是當今許多 UNIX 系統的超級用戶 -root- 的預設 shell.
  在過去三十年中,UNIX shell 獲得了許多改進和增強.結果,出現了多種不同的 shell.圖 1 顯示了少數 UNIX shell 的家族樹.雖然該圖並不完整,但它顯示了衍生出其他較次要 shell 的那些主要 shell.

圖 1. UNIX shell 家族樹

 

Korn shell
  1982 年,AT&T 貝爾實驗室的 David Korn 開發了 Korn shell(即 ksh).Korn shell 與許多其他 shell 類似,向後兼容 Bourne shell (sh).在超過 25 年的發展歷程中,它已進化為強健、穩定和非常可靠的 shell.IBM 在 AIX 中使用 Korn shell 作為其預設 shell.Korn shell 共有兩個版本,它們均包含在 AIX 中.
  第一種是 AIX 普通用戶的預設 shell,即標準 ksh shell.Korn shell 符合計算機環境的可移植操作系統介面標準 (POSIX),這是操作系統的國際標準.
  AIX 提供的第二種 Korn shell 是增強 Korn shell,稱為 ksh93.除標準 Korn shell 所擁有的所有強大功能外,增強 Korn shell 還包含如下功能:
  " 算術增強
  " 複合變數
  " 複合賦值
  " 關聯數組
  " 變數名引用
  " 參數擴展
  " 規程函數
  " 函數環境
  " PATH 搜索規則
  " shell 歷史記錄
  " 其他內置命令
  有關 ksh93 增強功能以及 ksh 與 ksh93 之間差異的完整列表,請參閱參考資料.
  使用 ksh 設置命令行環境
  在介紹如何使用 ksh 編輯命令行之前,必須設置您的環境.根據您的喜好來設置 Korn shell 相當簡單:登錄到 ksh 下時,使用帶有 -o 開關的 set 命令來查看您的當前設置:
  # set -o

  Current option settings are:
  allexport off
  bgnice on
  emacs off
  errexit off
  gmacs off
  ignoreeof on
  interactive on
  keyword off
  markdirs off
  monitor on
  noexec off
  noclobber off
  noglob off


  nolog off
  notify off
  nounset off
  privileged off
  restricted off
  trackall off
  verbose off
  vi off
  viraw on
  xtrace off

  下面簡單介紹各項設置.(您也可以通過運行 man set 找到這些說明.)
  " allexport:自動導出所有定義的後續變數.
  " bgnice:在後台以更低的優先順序運行所有進程.
  " emacs:編輯輸入的命令行文本時,使用 emacs 風格的行內編輯器.
  " errexit:如果某個命令產生非 0(零)的退出狀態並且設置了 ERR 陷阱,則執行 ERR 陷阱並退出.
  " gmacs:編輯輸入的命令行文本時,使用 gmacs 風格的行內編輯器.
  " ignoreeof :忽略文件結束字元,並且不退出 shell.如果用戶想要退出,則必須鍵入 exit 命令或按 11 次 Ctrl-D.
  " keyword :此選項將命令的所有參數放入環境中,而不僅僅放入命令之前的參數,使用 set 命令可以查看這些參數.
  " markdirs:在來自文件名替換的所有目錄的末尾添加一個正斜杠 (/).
  " monitor:將所有後台進程作為獨立進程運行,並在進程結束時向 stdout 輸出一行信息以通知用戶.
  " noexec:不執行命令.僅檢查語法錯誤.
  注意:此參數在互動式 shell 中無效.
  " noclobber :當輸出重定向到現有文件時,此標記可阻止截斷這些文件.然而,啟用此選項后,如果使用大於號加管道符號 (>|),則仍然會發生截斷.
  " noglob:禁用文件名替換.
  " nolog:如果使用此選項,則函數定義不會存儲在歷史文件中.
  " nounset:如果執行替換,則所有未設置參數都作為錯誤返回.
  " restricted :運行受限制的 shell.用戶無法執行下列操作:更改目錄;更改 SHELL、ENV 或 PATH 變數;執行在文件名中包含正斜杠 (/) 的命令;或重定向輸出.
  " trackall:每個命令在最初運行時都作為被跟蹤的別名.
  " verbose:當 shell 讀取輸入行時,向 stdout 顯示所有這些行.
  " vi:編輯輸入的命令行文本時,使用 vi 風格的行內編輯器.
  " viraw:鍵入字元時,將每個字元處理成在 vi 編輯器下輸入的原樣.
  " xtrace:執行命令時,向 stdout 顯示所有命令和參數.
  若要開啟內置命令集選項,請使用 -o 開關.相反,如果改變主意,可以使用 o 開關關閉這些選項.
  本文將重點講述的主要選項是行內編輯器開關.根據個人喜好不同,人們往往偏愛 vi、emacs 或 gmacs 文件編輯器中的某一個.Korn shell 包含所有這三種編輯器.然而,我將重點介紹 vi 行內編輯器.將行內編輯器選項設置為 vi 十分簡單.只需在用於查看所有當前設置的命令后加上選項 vi:


  # set -o vi

  大功告成!若要驗證該設置,可以再次查看您的當前設置:
  # set -o

  Current option settings are:
  allexport off
  bgnice on
  emacs off
  errexit off
  gmacs off
  ignoreeof on
  interactive on
  keyword off
  markdirs off
  monitor on
  noexec off
  noclobber off
  noglob off
  nolog off
  notify off
  nounset off
  privileged off
  restricted off
  trackall off
  verbose off
  vi on
  viraw on
  xtrace off


  使用 Korn shell vi 行內編輯器
  既然已將您的 shell 配置為使用 vi 行內編輯器,現在應該開始進行測試了.
  在命令行上修改文本
  現在,當您在命令行上鍵入時,將其視為處於 vi 編輯器中的插入模式.如果出錯或者需要向要執行的命令添加一些內容,只需按 Esc 鍵退出插入模式並切換回命令模式.
  例如,您當前所在的工作目錄包含如下文件:
  # ls
  fileA fileAA fileAAA fileAB fileABA fileABB fileB fileBAA fileBB fileBBB

  您希望查找以 fileAA 開頭的文件並刪除它們,於是輸入以下命令:
  # find . -name "fileAB*" -exec rm {} ;

  在執行您輸入的行之前,您發現自己犯了一個錯誤,意外地將 fileAA 誤輸入為 fileAB.不必擔心.只需退出插入模式並切換到命令模式,將游標移動到錯誤字元並進行替換,所有這些操作都使用 vi 命令完成.下面詳細說明命令序列,此時仍然處於行內編輯器的插入模式:
  1. 按 Esc 切換到命令模式.
  2. 使用 vi 風格的移動命令向左移動游標,以突出顯示字元串"fileAB*"中的 B.(H 鍵可向左移動游標.)
  注意:如果您習慣於在 vi 中使用箭頭鍵,那麼明智的做法是了解鍵盤上用於移動游標的實際字母鍵,不同類型的終端上的箭頭鍵不一定能產生預想中的結果:
  o h:向左
  o l:向右
  o k:向上
  o j:向下
  3. 使用 vi 風格的"替換單個字元"命令將 B 替換為 A(即單擊 R,然後鍵入 A).
  經過檢查確認輸入無誤后,按 Enter 鍵執行命令:
  # find . -name "fileAA*" -exec rm {} ;
  # ls
  fileA fileAB fileABA fileABB fileB fileBAA fileBB fileBBB

  文件名完成
  Korn shell 中 vi 行內編輯器的另一個十分有用的操作是文件名完成.執行命令時,經常會遇到這樣一種情況,您用作 stdin、stdout 或 stderr 參數的文件將被寫入到某個文件中.文件名可能很長,也可能有多個文件具有類似的文件名,或者您就是無法記起完整的文件名.這時就會用到文件名完成功能.在鍵入文件名時,如果完成了一部分,那麼只需先按 Esc 鍵,再按反斜杠 ()鍵.這樣做省時省力!


  例如,我要查看 AIX 上的 /etc/filesystems 文件,但我忘記了完整文件名.我知道它位於 /etc 下,並且該文件以 file 開頭,僅此而已.我只需鍵入 view /etc/file 並按 Esc-,哇!ksh 已經為您完成了這行內容.現在命令行顯示為 view /etc/filesystems.
  對於目錄結構也可以執行同樣的操作,它們實際上也可算作文件名.
  查看和修改命令歷史記錄
  在您的 UNIX 系統上監視進程或執行其他一些功能時,您需要多次反覆鍵入相同的命令.為了避免反覆重新輸入的麻煩,Korn shell 提供了內置的命令歷史記錄供您查看.如果您也將行內編輯器設為 vi,ksh 將允許您提取用戶所執行命令的歷史記錄(有時僅限該會話,具體取決於您的系統配置),並按照您在命令行中輸入的其他文本修改命令.
  如果您在變數 HISTFILE 中定義了一個文件名,ksh 允許用戶從其歷史記錄中提取和修改命令,或僅僅再次執行原始命令.例如,以下是示例 $HISTFILE 顯示的 10 個命令:
  # tail -10 $HISTFILE
  ls
  cd ~cormany/testdir/dirA
  ./fileA 1>fileA.out 2>fileA.errors
  pwd
  ps -fu cormany
  df -k .
  ps -fu cormany
  find . -name "fileA.out" -ls
  find . -name "fileA.errors" -ls
  tail -10 $HISTFILE

  在命令行中,只需按 Esc 鍵即可進入 vi 行內編輯器的命令模式,然後按 K 鍵提取上次執行的命令.由於您仍處於命令模式,您可以繼續按 K 鍵向上移動所執行命令的歷史記錄,或按 J 鍵向下移動列表.
  若要幫助簡化命令模式下的游標移動,當您在命令提示符處按 Esc 鍵時,請想象您載入的 $HISTFILE 為 vi 中的普通文件.在 vi 編輯器中,K 鍵向上移動一行,而 J 鍵向下移動一行.如果按 Esc-J 鍵並使用示例 $HISTFILE,想象正在編輯 $HISTFILE,並且游標開始位於文件底部.該行將顯示 tail -10 $HISTFILE.如果再次按 J 鍵,正在編輯的 $HISTFILE 將向上移動一行,顯示為 find . -name "fileA.errors" -ls.
  圖 2 提供了小型的"備忘單",將常規 vi 命令模式游標移動與 ksh vi 行內編輯器命令模式移動進行比較.

圖 2. vi 命令模式備忘單

 

命令行與 shell 腳本
  有時會用到 shell 腳本,其他一些時間則要用到命令行.如果需要定期執行某項任務,或者任務非常複雜、需要進行數據處理,同時不需要用戶反覆鍵入各種命令,則適合使用 shell 腳本.有時,某些任務只需要執行一次並且相對簡單,則使用命令行可以很好地完成這類任務.


  例如,假設存在下列字典列表:
  # ls
  fileA.tar.gz fileAA.tar.gz fileB.tar.gz fileBB.tar.gz

  如果只需要解壓縮文件,並使用 bzip2 重新壓縮,然後將它們傳送到 ATC-AIX2 上,那麼與其鍵入 shell 腳本,不如使用命令行.可以將 shell 腳本視為一次輸入多個命令行條目,從某種意義上來說,這就是實際情況.在命令行上鍵入命令時,就像將它們輸入到腳本中,然後執行腳本.
  您希望遍歷目錄中以 gz 結尾的文件,解壓這些文件,然後使用 bzip2 重新壓縮它們,再對這些文件使用 scp 命令,將它們複製到目標 ATC-AIX 伺服器上.循環在命令行中的工作效果與在腳本中同樣出色.當開始 loop…if 條件語句、case switch 語句,或其他代碼塊語句時,您正在運行的 ksh 只會將游標移動到下一行,但提示符將更改為 $PS2.當代碼塊完成時,將執行代碼塊並使用戶返回 $PS1 提示符.
  也就是說:
  " $PS1 提示符:等待下一個命令
  " $PS1 提示符:代碼塊開始
  " $PS2 提示符:代碼塊繼續
  " $PS2 提示符:代碼塊繼續
  " $PS2 提示符:代碼塊結束
  " 代碼塊執行
  " $PS1 提示符:等待下一個命令
  變數 PS2 的預設值為 >.返回前一個解壓縮后重新壓縮的功能,您只需在 ksh 命令行中鍵入以下內容:
  # for _FNAME in 'ls -1 *.gz'
  > do
  > gzip -d ${_FNAME}
  > bzip2 ${_FNAME%*.gz}
  > scp ${_FNAME%*.gz}.bz2 cormany@ATC-AIX2:/home/cormany
  > done

  完成代碼塊(也就是說,使用 done 結束循環)后按 Enter 鍵,將開始執行循環.在命令行上鍵入的循環將搜索當前工作目錄下以 .gz 結尾的所有文件,將這些文件解壓縮,然後使用 bzip2 重新壓縮它們,將它們複製到 ATC-AIX2 上的 /home/cormany 目錄中.就是如此簡單.

  結束語
  在閱讀本文之後,您應當能夠學會以新的方法使用 Korn shell.掌握命令行可以簡化您的工作,並幫助您更好地理解如何在工作中充分利用 shell 和命令行,從而擺脫使用它們的困擾.


[火星人 ] 對話 UNIX: 從簡單的按鍵操作學起已經有650次圍觀

http://coctec.com/docs/linux/show-post-56822.html