亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關注微信公眾號

對話 UNIX: 從簡單的按鍵操作學起
2009-04-23   IT168

用戶與計算機交互的方式在不斷發生變化。啟動后提供純命令行界面的操作系統已逐漸演化為圖形化前端。但是,脫離構成操作系統的構建塊有時并非是邁向正確方向的必要步驟。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 已經為您完成了這行內容?,F在命令行顯示為 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操作系統
下一篇:Unix時間并沒有出現錯誤

分享到: 收藏