shell命令 bash 是大多數Linux系統的缺省外殼。它克服了Bourne 外殼的缺點,又和Bourne 外殼完全兼容。
Bash有以下的特點:
·補全命令行。當你在bash 命令提示符下輸入命令或程序名時,你不必輸全命令或程序名,按Tab 鍵,bash將自動補全命令或程序名。
·通配符。在bash下可以使用通配符* 和?。*可以替代多個字符,而?則替代一個字符。
·歷史命令。bash 能自動跟蹤你每次輸入的命令,並把輸入的命令保存在歷史列表緩沖區。緩沖區的大小由HISTSIZE變量控制。當你每次登錄後,home 目錄下的.bash_history 文件將初始化你的歷史列表緩沖區。你也能通過history 和fc 命令執行、編輯歷史命令。
·別名。在bash下,可用alias 和unalias 命令給命令或可執行程序起別名和清除別名。這樣你可以用自己習慣的方式輸入命令。
·輸入/輸出重定向。輸入重定向用於改變命令的輸入,輸出重定向用於改變命令的輸出。輸出重定向更為常用,它經常用於將命令的結果輸入到文件中,而不是屏幕上。輸入重定向的命令是<,輸出重定向的命令是>。
·管道。管道用於將一系列的命令連接起來。也就是把前面的命令的輸出作為後面的命令的輸入。管道的命令是。
·提示符。bash 有兩級提示符。第一級提示符就是你登錄外殼時見到的,缺省為$。你可以通過重新給ps1變量賦值來改變第一級提示符。當bash需要進一步提示以便補全命令時,會顯示第二級提示符。第二級提示符缺省為>,你可以通過重新給ps2變量賦值來改變第二級提示符。一些特殊意義的字符也可以加入提示符賦值中。
·作業控制。作業控制是指在一個作業執行過程中,控制執行的狀態。你可以掛起一個正在執行的進程,並在以後恢復該進程的執行。按下Ctrl+Z 掛起正在執行的進程,用bg命令使進程恢復在後台執行,用fg命令使進程恢復在前台執行。
這裡列出的僅僅是最常用的bash命令子集,其他不太常用,但是在某方面有特殊用途的命令會在這個技術問題的目錄下專門提到(例如:ncheck命令會在文件系統維護裡介紹)
[目錄]
用戶常用
查找
find命令用於搜索目錄樹,並對目錄樹上的所有文件執行某種操作,參數是目錄名表(指出從哪些起點開始搜索),還可給出一個或多個選項,規定對每個文件執行什麼操作。
find / -print 將列出當前工作目錄下的目錄樹的每一個文件。
find / -user bob -print 將列出在系統中可找到的屬於bob用戶的所有文件。
find /usr/bob -perm 666 -print 將列出/usr/bob目錄樹下所有存取許可為666的文件。若將666改為-666則將列出所有具有包含了666在內的存取許可方式的文件(如777)。
find /usr/bob -type b -print 將列出/usr/bob目錄樹下所有塊特別文件(c為字符特別文件)。
find / -user root -perm -4000 -exec ls -l {} ; 是一個較復雜的命令,-exec COMMAND ;允許對所找到的每個文件運行指定的命令COMMAND。若COMMAND中含有{ },則{ }將由f i n d所找到的文件名替換。COMMAND必須以 ;結束。
各選項可組合使用以達到更強的功能。
遠程登陸
語法:rlogin 主機名[-1 用戶名]
例如:
rlogin doc 遠程登錄到工作站doc 中。
rlogin doc -l user 使用user 帳號登錄到工作站doc 中。
語法:telnet 主機名或telnet IP地址
例如:
telnet doc
telnet 140.109.20.251
更改密碼
語法: passwd
Old passWord: <輸入舊密碼>
New password: <輸入新密碼(最好為6~8字,英文字母與數字混合) >
Retype new password: <再輸入一次密碼>
檢查自己所屬的工作組名稱
語法:groups
查看系統中的用戶
語法: who 或finger
語法: who
語法: finger 用戶名或finger 用戶名@域名
改變用戶名
語法: su 用戶名
例如:
su user 進入用戶user 的帳號。
passwrod : <輸入用戶user 的密碼>
查看自己用戶名
語法: whoami 查看登錄時的用戶名。
語法: whoami 查看當前的用戶名。若已執行過su命令,則顯示出此用戶的用戶名。
查看當前系統上所有工作站的用戶
語法: rusers
按Ctrl+C> 結束
與某工作站上的用戶交談
語法: talk 用戶名@主機名或talk 用戶名@ I P地址
例如:
1) 可先利用rusers 指令查看網絡上的用戶;
2) 假設自己的帳號是u84987 ,在工作站indian 上使用,現在想要與doc 上的u84123 交談。
talk u84123@doc
此時屏幕上將會出現等待畫面
在對方( u84123 )屏幕上將會出現下列信息:
Message from Talk_Daemon@Local_host_name at xx:xx
talk: connection requested by u84987@indian
talk: respond with: talk u84987@indian
此時對方(u84123) 必須執行talk u84987@indian 即可互相交談。最後可按Ctrl + C結束。
顯示文檔幫助
語法: man 命令
例如:
man ls
語法:howto 主題
例如:
howto man
[目錄]
--------------------------------------------------------------------------------
文件或目錄處理
列出文件或目錄下的文件名。
語法: ls [-atFlgR] [name]
name :文件名或目錄名。
例如:
ls 列出目前目錄下的文件名。
ls -a 列出包括以.開始的隱藏文件的所有文件名。
ls -t 依照文件最後修改時間的順序列出文件名。
ls -F 列出當前目錄下的文件名及其類型。以/ 結尾表示為目錄名,以* 結尾表示為
可執行文件,以@ 結尾表示為符號連接。
ls -l 列出目錄下所有文件的權限、所有者、文件大小、修改時間及名稱。
ls -lg 同上,並顯示出文件的所有者工作組名。
ls -R 顯示出目錄下以及其所有子目錄的文件名。
改變當前工作目錄
語法:cd [name]
name:目錄名、路徑或目錄縮寫。
例如:
cd 改變目錄位置至用戶登錄時的工作目錄。
cd dir1 改變目錄位置至d i r 1目錄下。
cd ~user 改變目錄位置至用戶的工作目錄。
cd .. 改變目錄位置至當前目錄的父目錄。
cd ../user 改變目錄位置至相對路徑user 的目錄下。
cd /../.. 改變目錄位置至絕對路徑的目錄位置下。
cd ~ 改變目錄位置至用戶登錄時的工作目錄。
復制文件或目錄
語法: cp [-r] 源地址目的地址
例如:
cp file1 file2 將文件file1 復制成file2。
cp file1 dir1 將文件file1 復制到目錄dir1 下,文件名仍為file1。
cp /tmp/file1 . 將目錄/tmp 下的文件file1 復制到當前目錄下,文件名仍為file1。
cp /tmp/file1 file2 將目錄/tmp 下的文件file1 復制到當前目錄下,文件名為file2。
cp -r dir1 dir2 復制整個目錄。
移動文件目錄或修改名稱
語法: mv 源地址目的地址
例如:
mv file1 file2 將文件file1更名為file2。
mv file1 dir1 將文件file1移到目錄dir1 下,文件名仍為file1。
mv dir1 dir2 將目錄dir1 更改為目錄dir2。
建立新的目錄
語法: mkdir 目錄名
例如:
mkdir dir1 建立一新目錄dir1。
刪除目錄
語法: rmdir 目錄名或rm 目錄名
例如:
rmdir dir1 刪除目錄dir1,但dir1 下必須沒有文件存在,否則無法刪除。
rm -r dir1 刪除目錄dir1及其子目錄下所有文件。
刪除文件
語法: rm 文件名
例如:
rm file1 刪除文件名為file1 的文件。
rm file? 刪除文件名中有五個字符且前四個字符為file 的所有文件。
rm f* 刪除文件名中以f 為字首的所有文件。
列出當前所在的目錄位置
語法: pwd
查看文件內容
語法: cat 文件名
例如:
cat file1 以連續顯示方式,查看文件名file1 的內容。
分頁查看文件內容
語法: more 文件名或cat 文件名 more
例如:
more file1 以分頁方式查看文件名file1 的內容。
cat file1 more 以分頁方式查看文件名file1 的內容。
查看目錄所占磁盤容量
語法: du [-s] 目錄
例如:
du dir1 顯示目錄dir1 的總容量及其子目錄的容量(以KB 為單位)。
du -s dir1 顯示目錄dir1 的總容量。
文件的鏈接
同一文件,可擁有一個以上的名稱,也就是把一個文件進行鏈接。
語法:ln 老文件名新文件名
例如:
ln file1 file2 將文件file2鏈接至文件file1。
語法:ln -s 老文件名新文件名
例如:
ln -s file3 file4 將文件file4 鏈接至文件file3。
[目錄]
--------------------------------------------------------------------------------
文件內容操作
改變文件或目錄的最後修改時間
語法:toUCh name
name:文件名或目錄名。
2.3.21 文件中字符串的查尋
語法:grep string file
例如:
grep abc file1 尋找文件f i l e 1中包含字符串abc 所在行的文本內容。
查尋文件或命令的路徑
語法:whereis command 顯示命令的路徑。
語法:which command 顯示命令的路徑,及使用者所定義的別名。
語法:whatis command 顯示命令功能的摘要。
語法:find search-path -name filename -print 搜尋指定路徑下某文件的路徑。
例如:
find / -name file1 -print 自根目錄下尋找文件file1 的路徑。
比較文件或目錄的內容
語法:diff [-r] name1 name2
name1 name2:可同時為文件名或目錄名。
例如:
diff file1 file2 比較文件file1 與file2 內各行的不同之處。
diff -r dir1 dir2 比較目錄dir1 與dir2 內各文件的不同之處。
文件打印輸出
用戶可用.login 文件中的setenv PRINTER來設定打印機名。
例如:
setenv PRINTER sp 設定自sp 打印機打印資料。
一般文件的打印
語法:lpr [-P打印機名] 文件名
例如:
lpr file1 或lpr -Psp file1 自sp打印機打印文件file1。
語法:enscript [-P打印機名] 文件名
例如:
enscript file3 或enscript -Psp file3 自sp打印機打印文件file3。
troff 文件的打印
語法:ptroff [-P打印機名] [-man][-ms] 文件名
例如:
ptroff -Psp -man /usr/man/man1/lpr1 以troff 格式,自sp 打印機打印lpr1 命令的使用說明。
[目錄]
--------------------------------------------------------------------------------
文件傳輸
1. 拷貝文件或目錄至遠程工作站
語法: rcp [-r] 源地址主機名:目的地址
源地址文件名、目錄名或路徑。
主機名工作站名。目的地址路徑名稱。
例如:
rcp file1 doc:/home/user 將文件f i l e 1拷貝到工作站doc 路徑/home/user 下。
rcp -r dir1 doc:/home/user 將目錄d i r 1拷貝到工作站doc 路徑/home/user 下。
2. 自遠程工作站,拷貝文件或目錄
語法: rcp [-r] 主機名:源地址目的地址
主機名工作站名。
源地址路徑名。
目的地址、文件名、目錄名或路徑。
例如:
rcp doc:/home/user/file1 file2 將工作站d o c路徑/home/user 下的目錄d i r 1,拷貝到當前工作站的目錄下,目錄名仍為d i r 1。
rcp -r doc:/home/user/dir1 . 將工作站doc 路徑/home/user 下的目錄d i r 1,拷貝到當前工作站的目錄下,目錄名仍為d i r 1。
3. 本地工作站與遠程工作站之間的文件傳輸
必須擁有遠程工作站的帳號及密碼,才可進行傳輸工作。
語法: FTP 主機名或ftp ip地址
例如:
ftp doc 與遠程工作站doc 之間進行文件傳輸。
Name (doc:user-name): <輸入帳號>
Password (doc:user-password): <輸入密碼>
ftp> help 列出ftp 文件傳輸時可使用的命令。
ftp> !ls 列出本地工作站當前目錄下的所有文件名。
ftp> !pwd 列出本地工作站當前所在的目錄位置。
ftp> ls 列出遠程工作站當前目錄下的所有文件名。
ftp> dir 列出遠程工作站當前目錄下的所有文件名。
ftp> dir . more 分頁列出遠程工作站當前目錄下的所有文件名。
ftp> pwd 列出遠程工作站當前所在的目錄位置。
ftp> cd dir1 更改遠程工作站的工作目錄位置至dir1 之下。
ftp> get file1 將遠程工作站的文件f i l e 1拷貝到本地工作站中。
ftp> put file2 將本地工作站的文件f i l e 2拷貝到遠程工作站中。
ftp> mget *.c 將遠程工作站中擴展文件名為c 的所有文件拷貝到本地工作站中。
ftp> mput *.txt 將本地工作站中擴展文件名為txt 的所有文件拷貝到遠程工作站中。
ftp> prompt 切換交互式指令(使用mput/mget 時不是每個文件皆詢問y e s / n o )。
ftp> quit 結束ftp 工作。
ftp> bye 結束ftp 工作。
注意從PC與工作站間的文件傳輸也可透過在PC端的FTP指令進行文件傳輸,指令用法與上述指令大致相同。
[目錄]
--------------------------------------------------------------------------------
文件權限的設定
改變文件或目錄的讀、寫、執行權限
語法:chmod [-R] mode name
name:文件名或目錄名。
mode: 3個8位數字或rwx的組合。r-read (讀),w-write (寫),x-execute (執行),u-user (當前用戶),g-group(組),o-other(其他用戶)。
例如:
chmod 755 dir1 對於目錄dir1,設定成任何使用者皆有讀取及執行的權利,但只有所
有者可做修改。
chmod 700 file1 對於文件file1,設定只有所有者可以讀、寫和執行的權利。
chmod u+x file2 對於文件file2,增加當前用戶可以執行的權利。
chmod g+x file3 對於文件file3,增加工作組使用者可執行的權利。
chmod o-r file4 對於文件file4,刪除其他使用者可讀取的權利。
改變文件或目錄的所有權
語法:chown [-R] 用戶名name
name:文件名或目錄名。
例如:
chown user file1 將文件file1 改為用戶user 所有。
chown -R user dir1 將目錄dir1及其子目錄下面的所有文件改為用戶user 所有。
改變文件或目錄工作組所有權
語法:chgrp [-R] 工作組名name
name:文件名或目錄名
例如:
chgrp vlsi file1 將文件file1 的工作組所有權改為vlsi 工作組所有。
chgrp -R image dir1 將目錄dir1及其子目錄下面的所有文件,改為image 工作組所有。
[目錄]
--------------------------------------------------------------------------------
進程控制
1.查看系統中的進程
語法:ps [-aux]
例如:
p s或ps -x 查看系統中,屬於自己的進程。
ps -au 查看系統中,所有用戶的進程。
ps -aux 查看系統中,包含系統內部的及所有用戶的進程。
2. 結束或終止進程
語法:kill [-9] PID
PID:利用ps 命令所查出的進程號。
例如:
kill 456或kill -9 456 終止進程號為456 的進程。
3. 在後台執行進程的方式
語法:命令&
例如:
cc file1.c & 將編譯file1.c 文件的工作置於後台執行。
語法:按下Control+Z鍵,暫停正在執行的進程。鍵入bg命令,將暫停的進程置於後台繼
續執行。
例如:
cc file2.c
^ Z
Stopped
bg
4. 查看正在後台中執行的進程
語法:jobs
5. 結束或終止後台中的進程
語法:kill %n
n:利用jobs命令查看出的後台作業號
例如:
kill % 終止在後台中的第一個進程。
kill %2 終止在後台中的第二個進程。
[目錄]
--------------------------------------------------------------------------------
命令管道
語法:命令1 命令2 將命令1的執行結果送到命令2,做為命令2的輸入。
例如:
ls -Rl more 以分頁方式列出當前目錄及其子目錄下所有文件的名稱。
cat file1 more 以分頁方式列出文件file1 的內容。
[目錄]
--------------------------------------------------------------------------------
輸入輸出控制
1. 標准輸入的控制
語法:命令< 文件將文件做為命令的輸入。
例如:
mail -s “mail test”
[email protected] < file1 將文件file1 當做信件的內容,主
題名稱為mail test,送給收信人。
2. 標准輸出的控制
語法:命令> 文件將命令的執行結果送至指定的文件中。
例如:
ls -l > list 將執行“ls -l” 命令的結果寫入文件list 中。
語法:命令>! 文件將命令的執行結果送至指定的文件中,若文件已經存在,則覆蓋。
例如:
ls -lg >! list 將執行“ls - lg” 命令的結果覆蓋寫入文件list 中。
語法:命令>& 文件將命令執行時屏幕上所產生的任何信息寫入指定的文件中。
例如:
cc file1.c >& error 將編譯file1.c 文件時所產生的任何信息寫入文件error 中。
語法:命令>> 文件將命令執行的結果附加到指定的文件中。
例如:
ls - lag >> list 將執行“ls - lag” 命令的結果附加到文件list 中。
語法:命令>>& 文件將命令執行時屏幕上所產生的任何信息附加到指定的文件中。
例如:
cc file2.c >>& error 將編譯file2.c 文件時屏幕所產生的任何信息附加到文件error 中。
[目錄]
--------------------------------------------------------------------------------
編輯
[目錄]
--------------------------------------------------------------------------------
Vi
Vi 輸入模式
要如何輸入資料呢?有好幾個指令可以進入輸入模式:
新增 (append)
a 從游標所在位置後面開始新增資料,游標後的資料隨新增資料向後移動。
A 從游標所在列最後面的地方開始新增資料。
插入 (insert)
i 從游標所在位置前面開始插入資料,游標後的資料隨新增資料向後移動。
I 從游標所在列的第一個非空白字元前面開始插入資料。
開始 (open)
o 在游標所在列下新增一列並進入輸入模式。
O 在游標所在列上方新增一列並進入輸入模式。
也許文字敘述看起來有點繁雜,但是只要實際操作一下馬上可以了解這些操作方式。實務很重要,尤其是電腦方面的東西隨時可以嘗試及驗證結果。極力建議實際去使用它而不要只是猛 K 文件,才有事半功倍的效用。(注:此段為廢話。)
Vi 基本編輯
配合一般鍵盤上的功能鍵,像是方向鍵、[Insert] 、[Delete] 等等,現在你應該已經可以利用 vi 來處理文字資料了。當然 vi 還提供其他許許多多功能讓文字的處理更形方便,有興趣的看倌請繼續。
在繼續下去之前先來點 BCC 吧。電腦有許多廠牌,不同的硬體及作業系統。PC 也不是僅僅只有 IBM PC 及其相容品而已。事實上,包括鍵盤,終端機等等往往都有不同的規格。這代表什麽?
在文書編輯軟體上會遇這樣的問題,某些電腦的鍵盤上沒有特定的幾個功能鍵!那麽不就有某些功能不能用了?這個問題在 Unix 系統上也一樣,幾乎各大電腦廠商都有自己的 Unix 系統,而 vi 的操作方法也會隨之有點出入。我們固然可以用 PC 的鍵盤來說明 vi 的操作,但是還是得提一下這個問題。
刪除與修改
何謂編輯?在這裡我們認為是文字的新增修改以及刪除,甚至包括文字區塊的搬移、復制等等。這裡先介紹 vi 的如何做刪除與修改。(注意:在 vi 的原始觀念裡,輸入跟編輯是兩碼子事。編輯是在指令模式下操作的,先利用指令移動游標來定位要進行編輯的地方,然後才下指令做編輯。)
x 刪除游標所在字元。
dd 刪除游標所在的列。
r 修改游標所在字元,r 後接著要修正的字元。
R 進入取代狀態,新增資料會覆蓋原先資料,直到按 [ESC] 回到指令模式下為止。
s 刪除游標所在字元,並進入輸入模式。
S 刪除游標所在的列,並進入輸入模式。
其實呢,在 PC 上根本沒有這麽麻煩!輸入跟編輯都可以在輸入模式下完成。例如要刪除字元,直接按 [Delete] 不就得了。而插入狀態與取代狀態可以直接用 [Insert] 切換,犯不著用什麽指令模式的編輯指令。不過就如前面所提到的,這些指令幾乎是每台終端機都能用,而不是僅僅在 PC 上。
在指令模式下移動游標的基本指令是 h, j, k, l 。想來各位現在也應該能猜到只要直接用 PC 的方向鍵就可以了,而且無論在指令模式或輸入模式下都可以。多容易不是。
當然 PC 鍵盤也有不足之處。有個很好用的指令 u 可以恢復被刪除的資料,而 U 指令則可以恢復游標所在列的所有改變。這與某些電腦上的 [Undo] 按鍵功能相同。
Vi 進階應用
相信現在對於 vi 應該已經有相當的認識。處理文字也不會有什麽麻煩才對。如果有興趣善用 vi 的其它功能進一步簡化操作過程,不妨繼續看下去。
移動游標
由於許多編輯工作是藉由游標來定位,所以 vi 提供許多移動游標的方式,這個我們列幾張簡表來說明(這些當然是指令模式下的指令):
┌—————┬—————————————┬—————┐
│指令 │說明 │功能鍵 │
├—————┼—————————————┼—————┤
│0 │移動到游標所在列的最前面 │[Home] │
├—————┼—————————————┼—————┤
│$ │移動到游標所在列的最後面 │[End] │
├—————┼—————————————┼—————┤
│[CTRL][d]│向下半頁 │ │
├—————┼—————————————┼—————┤
│[CTRL][f]│向下一頁 │[PageDown]│
├—————┼—————————————┼—————┤
│[CTRL][u]│向上半頁 │ │
├—————┼—————————————┼—————┤
│[CTRL][b]│向上一頁 │[PageUp] │
└—————┴—————————————┴—————┘
┌——┬—————————————————┐
│指令│說明 │
├——┼—————————————————┤
│H │移動到視窗的第一列 │
├——┼—————————————————┤
│M │移動到視窗的中間列 │
├——┼—————————————————┤
│L │移動到視窗的最後列 │
├——┼—————————————————┤
│b │移動到下個字的第一個字母 │
├——┼—————————————————┤
│w │移動到上個字的第一個字母 │
├——┼—————————————————┤
│e │移動到下個字的最後一個字母 │
├——┼—————————————————┤
│^ │移動到游標所在列的第一個非空白字元│
└——┴—————————————————┘
┌——┬———————————————————┐
│指令│說明 │
├——┼———————————————————┤
│n- │減號移動到上一列的第一個非空白字元 │
│ │前面加上數字可以指定移動到以上 n 列 │
├——┼———————————————————┤
│n+ │加號移動到下一列的第一個非空白字元 │
│ │前面加上數字可以指定移動到以下 n 列 │
├——┼———————————————————┤
│nG │直接用數字 n 加上大寫 G 移動到第 n 列│
└——┴———————————————————┘
┌————┬———————————————┐
│指令 │說明 │
├————┼———————————————┤
│fx │往右移動到 x 字元上 │
│Fx │往左移動到 x 字元上 │
├————┼———————————————┤
│tx │往右移動到 x 字元前 │
│Tx │往左移動到 x 字元前 │
├————┼———————————————┤
│; │配合 f&t 使用,重復一次 │
│, │配合 f&t 使用,反方向重復一次│
├————┼———————————————┤
│/string │往右移動到有 string 的地方 │
│?string │往左移動到有 string 的地方 │
├————┼———————————————┤
│n │配合 /&? 使用,重復一次 │
│N │配合 /&? 使用,反方向重復一次│
└————┴———————————————┘
┌————┬———————————————————┬——————————┐
│指令 │說明 │備注 │
├————┼———————————————————┼——————————┤
│n( │左括號移動到句子的最前面 │句子是以 │
│ │前面加上數字可以指定往前移動 n 個句子 │! . ? 三種符號來界定│
│n) │右括號移動到下個句子的最前面 │ │
│ │前面加上數字可以指定往後移動 n 個句子│ │
├————┼———————————————————┼——————————┤
│n{ │左括弧移動到段落的最前面 │段落是以 │
│ │前面加上數字可以指定往前移動 n 個段落 │段落間的空白列界定 │
│n} │右括弧移動到下個段落的最前面 │ │
│ │前面加上數字可以指定往後移動 n 個段落│ │
└————┴———————————————————┴——————————┘
不要嘗試背誦這些指令,否則後果自行負責。它們看起來又多又雜亂,事實上這是文字敘述本身的障礙。再強調一次,實際去使用它只要幾次就可以不經大腦直接下達這些奇奇怪怪的指令,遠比死記活背搞得模模糊糊強多了。(注:若真的不經大腦而誤刪資料與我無關。另,此段為廢話。)
進階編輯指令
這些編輯指令非常有彈性,基本上可以說是由指令與范圍所構成。例如 dw 是由刪除指令 d 與范圍 w 所組成,代表刪除一個字 d(elete) w(ord) 。
指令列表如下:
d 刪除(delete)
y 復制(yank)
p 放置(put)
c 修改(change)
范圍可以是下列幾個:
e 游標所在位置到該字的最後一個字母
w 游標所在位置到下個字的第一個字母
b 游標所在位置到上個字的第一個字母
$ 游標所在位置到該列的最後一個字母
0 游標所在位置到該列的第一個字母
) 游標所在位置到下個句子的第一個字母
( 游標所在位置到該句子的第一個字母
} 游標所在位置到該段落的最後一個字母
{ 游標所在位置到該段落的第一個字母
說實在的,組合這些指令來編輯文件有一點點藝術氣息。不管怎麽樣,它們提供更多編輯文字的能力。值得注意的一點是刪除與復制都會將指定范圍的內容放到暫存區裡,然後就可以用指令 p 貼到其它地方去,這是 vi 用來處理區段拷貝與搬移的辦法。
某些 vi 版本,例如 linux 所用的 elvis 可以大幅簡化這一坨指令。如果稍微觀察一下這些編輯指令就會發現問題其實是定范圍的方式有點雜,實際上只有四個指令罷了。指令 v 非常好用,只要按下 v 鍵,游標所在的位置就會反白,然後就可以移動游標來設定范圍,接著再直接下指令進行編輯即可。
對於整列操作, vi 另外提供了更方便的編輯指令。前面曾經提到過刪除整列文字的指令 dd 就是其中一個;cc 可以修改整列文字;而 yy 則是復制整列文字;指令 D 則可以刪除游標到該列結束為止所有的文字。
檔案指令
檔案指令多以 : 開頭,跟編輯指令有點區別。例如前面提到結束編輯的指令就是 :q。
現在就簡單說明一下作為本篇故事的結尾:
:q 結束編輯(quit)
如果不想存檔而要放棄編輯過的檔案則用 :q! 強制離開。
:w 存檔(write)
其後可加所要存檔的檔名。
可以將檔案指令合在一起,例如 :wq 即存檔後離開。
zz 功能與 :wq 相同。
另外值得一提的是 vi 的部份存檔功能。可以用 :n,mw filename 將第 n 列到第 m 列的文字存放的所指定的 filename 裡去哩。時代在變,世界在變, vi 也在變,不過大致上就這樣。好了,但願從此以後王子跟公主過著幸福快樂的生活。
[目錄]
--------------------------------------------------------------------------------
Emacs
Emacs 啟動:
直接打emacs, 如果有X-windows就會開視窗. 如果不想用X 的版本,
就用 emacs -nw (No windows)起動.
符號說明
C-X 表示按住CTRL鍵, 然後按X, 再把CTRL, X一起放開.
M-X META META
在沒有META鍵的電腦上, M-X 等於先按 ESC鍵, 接著按 X鍵.
Sun上面META鍵就是菱形的那個鍵.
有些系統META鍵就是ALT鍵.(或者某一邊的ALT鍵)
C-X或 M-X的X沒有大小寫分別.
Emacs按鍵命令基本上是一串C-<chr>和M-<chr>組成的.
超過兩個以上的按鍵命令, Emacs會在螢幕最下面一行顯示你按過什麽.
這一行叫作mini buffer
結束Emacs按 C-x C-c
取消執行 C-g
有些Emacs命令會跑很久, 可以用C-g中斷之. 按錯鍵也可以按C-g取消.
上下移動 C-p 向上 (previous line) C-n向下(next line)
左右移動 C-f 向右 (forward) C-b 向左 (backward)
其實Emacs內部沒有行的概念, 把一篇文章放在一個大buffer
裡面, 所以C-f (forward)就是向檔尾移動, C-b (backward)
是移回去的意思, 一次一個字.
翻頁 下一頁 C-v (view next screen)
上一頁 M-v
翻頁時,上一 末尾會留一點在螢幕最上面,以維持連續性.
Emacs在游標接近螢幕最下方時會自動跳半頁, 把檔案往前挪一點,
方便閱讀.
重畫螢幕 C-L
Emacs裡面游標的專有名詞叫point. point == 游標目前的 點
游標一次跳一個字(word) M-f 往後跳 M-b
注意 C-f 與 M-f, C-b 與 M-b的對稱性.
移到行頭 C-a 行尾 C-e
移到句首 M-a 到句尾 M-e
(M-a 到上一個句點後面,一個句子的起頭.
M-e 到句點後面)
移到檔頭 M-< 檔尾 M->
刪除游標目前指的/後面的字 C-d
前面的字 DEL (Delete鍵)
DEL的正名叫Rubout (Rub out)
M-DEL 往回刪一個字(word)
M-d 往前刪 (游標後面)
C-k 刪至行尾 (kill)
M-k 刪到一句子結尾(刪到句點) (kill)
注意Backspace = C-h 在Emacs下是help的意思
後面有(kill)的, 表示此刪除的動作是kill, 不太等於delete.
emacs會把kill掉的東西放到kill ring去, 算是一種暫存的地方,
以後可以叫出來.見 yank說明.
Undo: C-x u
C-_ 等於 C-x u 有些DEC終端機, C-/就是C-_
有時等於C-Shift- -
重復執行
舉例, 向右移 8個字, C-u 8 C-f
C-u 在Emacs裡是蠻特別的,用來設定一些引數(argument/repeat count)
給其後的命令.
C-u 2 0 C-n 向下移 20行
有一個特別的例外, C-u 3 C-v 不是翻三頁, 而是整個螢幕向上移三行.
據說這比較有意義.
C-u 1 0 C-x u UNDO 10次
給C-L一個引數會怎麽樣:
C-u 0 C-l 會重畫螢幕,並且把目前的行移到螢幕第一行.
另外, C-u 100 等於 M-100
C-u 數字 等於 M-數字
X windows 下,
C-left C-right 一次移一個字(word).
C-up C-down 移動一段 (paragraphs/C語言的話是block)
Home = C-a
End = C-e
C-Home = M-<
C-end = M->
PgUp PgDn = M-v C-v
設定重覆次數更加簡單,
比如要向右移10個字 C-1 C-0 right-arrow
就是按住CTRL, 然後打10就對了, 比 C-u 1 0 簡單.
Mouse中鍵用來選取有hi-light的地方.
右鍵是menu-button
如果不小心按兩次ESC, 等於 M-ESC, 會有一個訊息跑出來
說你按到一個被disable的命令. 這是高級指令, 作者認為
初學者用不道,所以會問你要不要啟動它, 一般回答no.
如果某一行太長, 螢幕顯示不下, Emacs會在螢幕最右邊打個$,
表示此行未完,右邊還有.
把一行拆成兩行: 在想拆處按Enter即可.
合並兩行為一行: 在行尾按C-d (或行首按DEL)
Yank: 吐出被刪掉的(killed)東西.
只要用kill (C-k, M-k等) 刪除, 超過一個字的資料,
emacs就會把它存起來, 然後C-y 可以把它叫出來.
功能跟Cut & Paste一樣. Kill 和delete不一樣, 只有被
kill掉的東西才能用yank吐回來.
游標在同一地方不動, 連續kill掉的資料會被當成一次kill掉的,
yank時會一起回來.
被Kill掉的資料是放在稱作 kill ring的資料結構上面, ring就是個圓圈,
被kill掉的東西會依序擺在圓圈上. yank 會放回最近一次kill掉的資料.
如果不是你想要的話, 用M-y 可以換. (M-y就是告訴emacs, 不對不對,
我不是要這一個,換前一個給我).
M-y 要緊接在C-y之後.
拷貝文字的方法== 連續 C-k 幾次, 把要拷貝的行全部刪掉,
然後按 C-y 弄回來. 再到想復制的地方按一次C-y, 就成了.
把要拷貝的資料kill掉在yank回來好像很笨. 是有比較文明的
方法, 那就是M-w, 不過較麻煩.
首先,要先設標記. Mark 用 C-SPC 或 C-@ 設. 然候
把游標移到另一端, 按 M-w 就可以把 mark 到 point間的
字存到kill ring上. point 就是游標的意思.
Emacs不會把Mark起來的地方用highlight表示, 除非在X下.
在X下, 可以用M-w 來拷貝用滑鼠反白的文字.
kill & yank 就是 cut & paste的意思.
以上大部份指令對Bash的命令列編輯也有效
檔案操作
讀檔: Emacs術語叫 finding a file.
C-x C-f 然後在mini-buffer輸入檔名. 輸入檔名時, SPC鍵有
auto-complete的功能,或者會秀出到目前為止檔名前幾
個字和輸入一樣的. (TAB鍵也有類似功能)
C-x C-f 叫 find-file
C-x C-s 存檔 (save current file, save current buffer)
C-x s 存所有的檔
C-x i 插入檔案 把另外的檔案的內容讀入目前編輯區內
視窗
Emacs把檔案讀進來,存在buffer中.
我們透過window來看/編輯buffer.
兩個視窗會把螢幕切成兩部份, 他們可以同時顯示
相同的, 或不同的檔案.
對初學者而言, 最需要的是記住怎樣讓不想要的視窗消失:
C-x 0 關掉目前的視窗
C-x 1 會讓目前的視窗占滿整個螢幕 (One Window),
取消/關掉其他的視窗.
Emacs裡面有許多功能都會開一個小視窗來和使用者溝通, 顯示訊息.
有時候不會自動消失很討厭, C-x 1 就很有用.
另一個功能是如何跳到另一個視窗.
C-x o (other-window)
C-x 2 把目前的視窗切成兩個 (水平分割)
C-x 3 (垂直分割)
C-x 4 是一串與視窗有關的指令.
C-x 4 是一串與視窗有關的指令.
C-x 5 則是擴展到X的視窗, 稱為frame.
C-x 5 2 就是再開另一個X視窗 (frame).
多檔編輯
C-x C-b 看目前有那些buffer (buffer就是emacs放開起的檔案的地方).
C-x b 然後在minibuffer輸入buffer的名字,可以切換編輯buffer.
TAB鍵也有作用. 有些內部的buffer (就是沒有檔案的buffer),
是用*開頭和結束, 這個也要打, 如*scratch*
最候提醒:
C-x 1 可以把多馀的視窗關掉.
Emacs擴充指令
前面介紹的emacs按鍵大部份都是C-<chr> 或者 M-<chr>的形式.
這是最簡單的按法, 由一對按鍵構成一個指令.
Emacs的按鍵可以超過2個以上. 如 C-x 1 或 C-x C-b.
一般超過一個按鍵組合的命令都是用C-x 開頭.
另外你也可以直接下命令. 按 M-x 之後就可以打一個Emacs命
令來執行. 一般這些命令名字都很長, 不過都不常用. 等一下
我們會介紹一些. 還有介紹怎麽把這些命令設成按鍵指令.
C-x C-c 就是結束Emacs. 不過一般Emacs很笨重, 一旦起動就不輕易
退出. 所以比較常用的是C-z
C-z 把Emacs暫停, 回到命令列. 當你下次再需要編輯時,打fg %emacs
就可以把Emacs喚醒.
在X下, C-z會把emacs縮成icon
mode line
emacs編輯畫面由 編輯區(buffer) 狀態列 (modeline) 和對話區 (minibuffer)
構成. 這裡解釋 modeline 顯示的訊息.
以下是個范例:
--**-XEmacs: xemacs.qs (Fundamental)----74%-------
由後面往前解釋, 74% 表示游標的位置.
(Fundamental)表示編輯模式.這是最原始的模式. 編輯不同種類的文章
可能希望用不同的模式, 比如說C-mode, lisp-mode, tex-mode, text-mode
等等. 在不同模式下可能多一些按鍵出來. 舉例text-mode.
M-x text-mode
可以切入text-mode, 這是一般人編輯文字使用的模式. 和Fundamental mode
沒什麽差異. 不過游標移動時, Emacs對一個字的定義就有所不同, 因而
M-f M-b 等移動一個字, 一個段落的指令就可能會停在標點符號的前面.
此時狀態列變為... (Text)----70%---
以上說的是Major mode. 另外還有minor mode, 其實就是一些額外的功能.
比如說, M-x auto-fill-mode 則狀態列顯示 (Text Fill).
auto-fill就是自動斷行, 讓文章每行固定有70個字.
M-X fundamental-mode 可以變回來.
這裡要說明一下, emacs在 minibuffer下有auto-completion的功能,
也就是打M-x fund 然後按 SPC, 它會自動補全 fundamental-mode,
不用全打. 如果有兩個以上的選擇, 它會告訴你. 這個功能對
find-file (C-x C-f)等等檔案編輯功能也有效. 前面提過.
最後解釋兩個**號. 右邊的*表示文章被修改過了.
左邊的* 表示這個編輯區(buffer)可以修改.
有一些emacs的buffer是read-only buffer, 就會標成%
%%表示檔案是read-only.
C-x C-q 可以解開read-only的鎖定, 無論如何你要改這個編輯區.
這是個toggle指令, 如果原來是可以修改的, C-x C-q會把它切成
read-only.
Search
沒有Search 功能的編輯器簡直就是小朋友的玩具. Search
是一項很重要的功能, 所以emacs也提供的很完善.
C-s
C-r
M-x re-search-forward
M-x re-search-backward
M-x search-forward
M-x search-backward
以上這些指令是基本的search指令. C-s, C-r是increamental search,
就是你打字的同時, emacs就直接幫你找. 一個是forward, 一個是backward.
找到了怎麽辦? 按C-g可以取消搜尋, 跳回原來的位置. 按Enter就讓游標
停在找到的地方 -- 此時minibuffer顯示:Mark saved where search started
什麽意思? 就是isearch幫你在原來的位置設了一個mark, 然後把point
(cursor) 移到新的位置.
想跳回去原先的地方?
C-x C-x 就可以了.(exchange-point-and-mark)
C-u C-SPC 可以依序跳回前幾次設mark的地方.
(C-SPC是設mark, 給它一個argument, 就是反動作)
(還記不記得C-u 可以給後面的指令設一些參數.
有些指令拿這個參數來當作repeat count,
有些指令就只拿來當作on/off, true/false, set/clear而已)
M-x re-search-forward可以讓你用regular eXPression搜尋.
M-x search-forward則沒有increamental的功能.
另外一個指令, 作用和grep很像:
M-x occure
和search相提並論的就是replace.
M-x replace 然後按 SPC, 就知道了.
Emacs的設定:
Emacs的設定檔是 $HOME/.emacs
你應該多少知道, emacs是用lisp寫成的編輯器, .emacs檔也都是
要用lisp的語法設定. emacs用的lisp稱為elisp, 和一般的lisp差一點點.
有一個info page, emacs-lisp-intro, 深入淺出的介紹emacs lisp.
如果你還不會, 不懂programming, 強烈建議你看這份文件. 如果你
會texinfo, 你可以把它很漂亮的印出來. (內容一點點而已, 兩三
天就看完了)
如果你把.emacs搞砸了, 進emacs很奇怪, 怎麽辦?
1. 用 vi 改 .emacs :>
2. emacs -q 進 emacs
Major Modes
一般常見的emacs major mode有
fundamental-mode
text-mode
lisp-mode 有自動對括號/重排, 直接執行lisp code功能.
c-mode/cc-mode c-mode是比較舊的c-mode, cc-mode應該是
目前新的c-mode. 有自動重排/對括號的功能.
也可以在emacs內compile, 跳到compiler error
修正錯誤. 執行程式時debug. (配合dbx/gdb)
compile是透過Makefile進行.
tex-mode Tex/Latex編輯模示. 可能是打一些奇怪的標點
符號比較方便.
<programming-language>-mode
同lisp/cc-mode. 如果是interpreter的話,
emacs通常都可以直接執行/debug.
<programming-language>-mode還有tags的功能, 後述.
Html-mode, texinfo-mode, sgml-mode: 編寫html, texi, sgml之用.
w3-mode WWW browser. 在x-win上不滿意,但可以接受...
Tags
Tags 是一個顯為人知的功能? 所以我想提一下. 這不是emacs發明的,
而是vi 原本的特異功能. emacs只是發揚光大而已.
假設你有一個目錄, 裡面是一個程式的原始碼, 比如說, tin 的原始碼,
放在 ~/tin-1.3beta 下面. 你想看它們.
首先, 叫emacs cd到該目錄:
M-x cd
然後, 建立tag table.
tag table 就是一張對照表, 記錄哪個符號(variable/function call)
對映到哪個檔案的哪個地方. 有這張表, emacs可以讓我們快速的在程
式碼內游走. 一般這張表是一個檔案, 叫作TAGS (大寫)
M-! etags *.[ch]
M-! 是執行external shell command的意思. etags就是emacs的建表程式.
你只要告訴它你的source code在那□即可.
vi的話是使用ctags這個程式, 它建出來的檔名叫tags (小寫). 因為
我們介紹emacs, 所以不管它.
然後, 怎麽看程式? 你知道所有的C 程式都是由main()開始, 所以你想
找到main()在哪個檔案. 這時只要按 M-. 然後emacs會問你tag table
在哪裡. 因為我們已經cd到該目錄, 直接按enter就好了. 然後輸入main,
emacs就會把你帶到main(){ ... }去.
如果 你看到某個程式片斷呼叫一個你沒看過的函式, 你可以把游標
移到該函式的名字上, M-. ENTER 就搞定了.
如果 emacs找錯了 (比如有變數和函式同名, emacs跳到變數去),
那你可以用 C-u M-. 找下一個.
在編輯程式碼的時候, M-SPC 很有用, 它會把游標附近的空白縮成一個.
在其它地方也有效.
Emacs的一些package:
M-x dired (或C-x d)
游走/編輯 目錄, 就是檔案總管的意思 icon_smile.gif
M-x man 就是man page
M-x shell 開個command prompt, 不過不能跑vi,elm, tin...
M-x gnus 讀新聞/讀信
M-x rmail 讀信
M-x vm view mail
M-x mh-rmail 讀信 (package mh-e)
M-x mh-smail 送信 (package mh-e)
強列建議改用emacs讀news/bbs. 世界會更美好!
讀信的話就要看你的感覺. 這些讀信程式都會把信從系統的mail folder
搬到自己的目錄下, 占用quota, 我不喜歡 :p 建議elm或mutt.
除非參加mailling list配合procmail. 不然不實用.
用mh-e 須要裝mh 這個外部程式, 不太好. 建議vm 或 gnus.
寫完信, C-c C-c 就可以送信.
如果你的資料用rcs/sccs作版本管理, emacs自動會起動version control
(minor mode.), c-x c-q 變成check-in/check-out.
如何取得更多的資訊:
Emacs的lisp 經過多年的發展,已成為完整的self-documenting系統.
很多東西都可以線上找到你要的資訊.
前面說過,或者你已經不小心按backspace遇到了, C-h (就是backspace
的ascii碼) 在emacs裡面是help的意思, 它可以帶出一串指令.
常用的有:
C-h F Emacs FAQ
C-h t Emacs 使用教學
C-h n Emacs NEWS file, 介紹最近改版的新功能
C-h i Info system. Info是gnu用來取代man page的系統,
基本上和文字模示的WWW差不多. 有許多重要的資訊
可以在這邊找到. 如果你是新手, 建議你在x-win下
看. 不然, 按鍵 m (menuitem), SPC next page
l (last node: node就是章節的意思) u (up node)
d (Directory, 索引). BS (Backspace, back a page).
如果全部只按SPC, 就跟man 一樣.
C-h k describe key, 告訴你按這個鍵執行那個lisp function.
C-h f describe function. 告訴你function在作什麽.
如果只按SPC, emacs會給你所有lisp 函數的列表, 和說明.
C-h v describe variable 同function.
C-h a apropos的意思(approximate). 給lisp function的部份
字串, emacs幫你找.
C-h b 列出目前所有的keybinding
C-h m mode help. 列出目前的mode的特殊說明.
C-c C-h 列出以C-c 開頭的所有key-binding. 雖然說Emacs
可以定義按鍵, 可是Ctrl- 開頭的所有組合大概都用光了,
只有C-c算是可以自定指令. 不過有些mode也侵犯這個空間.
目前的convention是C-c <chr> 留給user, C-c C-<chr>
留給package.
有以上這些help, 你的emacs/elisp功力會隨著時間成長.
Elisp 簡介:
Emacs有三份手冊.第一份是使用手冊, 第二份是Elisp 手冊, 第三份是
Elisp 簡介. 第三份的程度是入門級, 值得看. Elisp手冊其實也寫的
很簡單, 還教你lisp, 不過有點長, 適合參考.
因為我lisp沒有仔細學過, 所以:
以下所言, 如有巧合, 那才是真的.
Basic data type
字串 (string) "Hello, World"
字元 (char) ?a ; 問號開頭
atom & list:
(1 2 3 4) 是一個list, 由 4個 atom 組成.
pair: 中間是句點.
(apple . 2)
alist (associated list)
就是一堆 pair的集合,就像perl/tcl的associative array.
或者說是一個資料庫, 一堆 (key, value) pair.
'((Apple . 1)
(Orange . 2)
(PineApple . 3))
vector (?)
emacs 19用vector 來表示按鍵(key strok sequence)
[f1] [f2] [f1 a]
nil 就是空的list, 或者表示 false
t true
Forms
我們寫程式最好有樣版讓我們填空最簡單了.
Form 就是樣版, 不過意義不太一樣.
Form 就是Elisp 可以接受的句型.
lisp 解譯器 預設是對list的每個元素求值(evaluate),
除非是 special form, 有特殊的定義. 比如說
(defun FUNC (ARG-LIST)
BODY ...)
就是一個special form, 用來定義函式, 所以FUNC 不會被
求值, 被當成symbol, ...
(quote (LIST))