- 論壇徽章:
- 0
|
完成這一章,你能夠作以下事情:
※了解shell的工作原理
※描述用戶登錄的過程
※描述用戶環(huán)境變量和這些環(huán)境變量的功能。
※設(shè)置和修改shell變量。
※了解和修改一些特殊的環(huán)境變量例如PATH ,TERM等等。
※為特定的應(yīng)用定制用戶環(huán)境變量。
6.1 什么是shell?
shell是一個交互性命令解釋器。Shell獨(dú)立于操作系統(tǒng),這種設(shè)計(jì)讓用戶可以靈活選擇適合自己需要的shell。shell讓你在命令行鍵入命令,經(jīng)過shell解釋后傳送給操作系統(tǒng)(內(nèi)核)執(zhí)行。
這一章介紹POSIX shell提供的交互的特征。
以下是shell功能的一個匯總:
※查找命令的位置并且執(zhí)行相關(guān)聯(lián)的程序
※為shell變量賦新值
※執(zhí)行命令替代
※處理 I/O重定向和管道功能
※提供一個解釋性的編程語言界面,包括tests,branches 和loops等語句
※當(dāng)你登錄到一個unix系統(tǒng),shell會為你的終端登錄線索定義一些特征,然后出現(xiàn)你的提示符。在POSIX,Bourn,K
shell中$符號為默認(rèn)的提示符。C shell中默認(rèn)的提示符是%號。
6.2 一些通常使用的shell
/usr/bin/sh ????POSIX shell
/usr/bin/ksh ????Korn shell
/usr/old/bin/sh ??Bourne shell
/usr/bin/csh ????C shell
/usr/bin/keysh ???A contest-sensitive softkey shell
/usr/bin/rksh ???Restricted Korn shell
/usr/bin/rsh ????Restricted Bourne shell
POSIX shell
、是一個POSIX兼容的命令編程語言和命令解釋器。它可以從終端或者是一個文件中讀取并且執(zhí)行命令。POSIX在許多方面同korn
shell 相似。有歷史機(jī)制。支持任務(wù)控制,和其他有用的特性。
Korn shell 同POSIX shell十分類似,是由貝爾試驗(yàn)室的David Korn開發(fā)的。
Bourne shell :缺乏許多在POSIX,和korn shell 中的功能。它是由Stephen R.
Bourne開發(fā)的,是AT&T unix中最先使用的shell
C shell。是一個普通的語言解釋器,有命令歷史機(jī)制,類似C語言的語法。和任務(wù)控制工具。它是由university of
California at Berkeley 的william Joy開發(fā)的。
Rsh 和rksh是Bourne shell 和Korn shell
的受限制的版本。受限制的shell在設(shè)置登錄名和環(huán)境的時候比普遍的shell
有更多的限制。受限制的shell使用起來就象是具有異常現(xiàn)象的標(biāo)準(zhǔn)的shell。
使用受限制的shell的用戶不能:
※更改目錄
※重新設(shè)定PATH變量的值
※在路徑名中使用/符號。
※重定向輸出。
????????shell特征的一個比較
特性 描述 POSIX BourneKorn C
命令歷史 ?在緩沖區(qū)內(nèi)存儲命令,以便可以修改和重用
?支持 ??不支持 ??支持 ??支持 ?
行編輯可以使用一個文本編輯器來修改當(dāng)前的或是先前輸入的命令
?支持 ??不支持 ??支持 ??不支持 ?
文件名自動完成 在命令行自動完成鍵入的文件名?支持 ?不支持 ??支持 ??支持 ?
命令別名 用戶可以重命名命令,自動包含?命令選項(xiàng),或縮短長命令行輸入 ?支持 ??不支持 ??支持 ??支持 ?
受限制的Shell 提供一個可控制的和一些有限的功能的安全性的特性?支持 ??支持 ??支持 ??不支持 ?
任務(wù)控制?一個跟蹤和存取后臺運(yùn)行的進(jìn)程的工具?支持 ??不支持 ??支持 ??支持 ?
6.3 POSIX shell的特性
POSIX shell 是unix提供的shell中的一個。這種shell有許多Korn shell擁有,但Bourne
shell沒有的特征。即使你不會使用到所有的高級特征,你仍然會發(fā)現(xiàn)POSIX shell 是一個非常方便的用戶界面。以下是POSIX
shell的一些特性:
※命令的歷史機(jī)制。
※命令行重調(diào)用和編輯
※任務(wù)控制。
※文件名自動完成。
※命令的別名。
※增強(qiáng)的cd。
※先進(jìn)的編程能力。
6.4 別名
別名就是命令的一個新的名稱。使用別名可以縮短長命令行輸入,創(chuàng)建新的命令,或用一種稱為別名的新的命令來替代原始的命令執(zhí)行。別名的組成可以是一個字母或一個短的單詞。例如,許多的人非常頻繁地使用ps
–ef 命令。如果你使用psf代替這個命令是否會更容易一些?你使用alias命令可以創(chuàng)建別名:
$ alias name= string
在這里,name是你要取的別名,而string是name要取代的命令或者字符串。如果string包括有空格,你要需用引號將整個字符串括起來。別名對于減少鍵盤輸入,減少打字錯誤,或是創(chuàng)建新的命令會很方便。
別名在使用的時候和其他的命令一樣。 執(zhí)行一個真的的unix系統(tǒng)命令和執(zhí)行引用到一個unix命令的別名對于用戶來說是透明的,沒有任何區(qū)別。
別名經(jīng)常用于全路徑名的一個縮寫。
如果不帶差數(shù),alias命令會報告當(dāng)前定義的所有的別名。
想要列出一個特定的別名,使用alias name命令。
禁止一個別名,可以使用unalias命令,語法是:
unalias name
例子:
$ alias go=’cd’
$ alias there = /home/user3/tree/ford/sports
$ go there
$pwd
/home/user3/tree/ford/sports
6.5 文件名自動完成
例子:
?$ more fra esc esc
?$ more frankenstein
?.
?.?
?.
?$ more abc esc esc
?$ more abcdef esc =
?1)abcdefx1mnop
?2)abcdefy1mnop
?$ more abcdef
然后打x或y,然后連續(xù)按兩下esc鍵
系統(tǒng)就會自動完成相關(guān)聯(lián)的文件名。
當(dāng)你想要存取一個長文件名的時候,你可以使用文件名自動完成功能,如果你輸入的字符足夠多,能唯一標(biāo)識一個文件名后,你可以連續(xù)敲兩下esc鍵,POSIX
shell就會自動補(bǔ)全文件名的剩余部分。如果輸入的字符串并不唯一,POSIX shell 就不能解析到文件名,你的終端會發(fā)出蜂鳴。
直到?jīng)]有文件名沖突時候,連續(xù)敲兩下esc鍵,shell會自動完成文件名。你也可以通過敲一下esc鍵來列出所有可能的文件名。在POSIX
shell列出了有效的選項(xiàng)的時候,你就能夠使用編輯命令來增加后來的字符來唯一地確定你所需要的文件名,然后你可以連續(xù)敲兩下esc鍵來完成文件名。
文件名自動完成可以在所有的使用文件名路徑的時候使用,例如:
$cd tr esc esc do esc esc r esc esc
會顯示以下的命令行:
$cd tree/dog.breeds/retriever
6.5 命令的歷史機(jī)制
語法:
history [-n| a z] 顯示以前輸入的命令。
例子:
$ history –2 列出最近輸入的兩個命令
15.cd
16.more .profile
$ history 3 5 列出命令號從3到5的所有的命令
3.date
4.pwd
5.ls
POSIX shell保留一個歷史文件來存儲你所鍵入的命令,你可以重輸入這些命令。這個歷史文件會在你登錄時建立,在退出登錄時被刪除。
history命令會顯示你最近輸入的16個命令,每一個命令前面都會有一個命令號。你可以通過這個命令號來引用你以前鍵入的命令。
你可以鍵入history –n 來顯示少于或者多于16個命令。其中n代表命令號。
你可以鍵入history a z 來顯示一個命令號的范圍。其中a z代表命令號的一個范圍。
HISTSIZE變量定義了保存的的歷史命令的數(shù)目。(默認(rèn)值是128)HISTFILE變量定義了保存歷史命令的文件的一個文本文件名(默認(rèn)值是.sh_history).
6.6 重新輸入命令
你可以通過簡單地鍵入
r c
來從命令歷史中運(yùn)行任意的命令。
其中c 代表命令號。你也可以鍵入命令的第一個字母來執(zhí)行你最近鍵入的命令,例如:
$ history
1 date
2 cat file1
3 ls –l
$ r d
Mon Jul 4 10:03:13 1994
6.7 用戶環(huán)境
語法:
env
例子:
$ env
HOME=/home/gerry
PWD=/home/gerry/develop/hasics
EDITOR=vi
TERM=70092
......
PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin:/home/gerry/bin
用戶環(huán)境記錄了關(guān)于用戶程序的線程的許多信息。 你的環(huán)境中的信息有:
※你home路徑的路徑名
※電子郵件的存放地址。
※你所在地的時區(qū)
※你登錄的用戶名
※shell查找命令的路徑
※終端類型
※你的應(yīng)用可能需要的其他東西。
例如:命令vi和more 需要知道你的終端類型才能以正確的格式輸出數(shù)據(jù)。
與用戶環(huán)境類似的是你的辦公環(huán)境。在辦公室里的燈光,聲音,和溫度對所有的工作者都是相同的。而其他的對你來說唯一的因素組成了你的特殊的環(huán)境。這些因素包括你正在執(zhí)行的工作,你的寫字臺的布局,和你和辦公室其他人的關(guān)系。你的工作環(huán)境就像你的用戶環(huán)境一樣都是唯一的。
許多應(yīng)用需要你按照一些方式來定制你的環(huán)境。這種定制是通過修改你的.profile文件來完成的。
你可以運(yùn)行env命令來檢查你的環(huán)境。這個命令會顯示你的環(huán)境中的每一個變量和變量的值。
每一個環(huán)境變量的設(shè)置都有一個的意義,以下是一些普通的環(huán)境變量和它們的含義:
TERM,COLUMNS,LINES ???你使用的終端的類型。
HOME ??????????你的home目錄的路徑
PATH ??????????查找命令的位置的一個目錄的列表。
LOGNAME ????????登錄時使用的用戶名
ENV,HISTFILE ??????特殊的POSIX shell 變量
DISPLAY ????????特殊的x windows 變量
在這些變量中,一些是系統(tǒng)設(shè)置的變量,其他都是在/etc/profile 或.profile中設(shè)置。
6.8設(shè)置SHELL變量
※shell變量是一個名稱,代表一個值
※與這個名稱管關(guān)聯(lián)的值可以被修改
※一些shell變量是在登錄的過程中定義的。
※用戶可以自己定義新的shell變量
語法:
?name=vales
例子:
?$ PATH=/usr/bin/X11:/usr/bin
shell
變量同代數(shù)中的變量很相似。它是代表一個數(shù)值。給一個變量賦值就是將一個數(shù)值分配到一個變量名上。然后就可以通過這個變量名來存取這個數(shù)值。如果這個值被修改,仍然能夠通過變量名來存取新的值。給shell變量賦值的語法是:
name=value
你可以在終端的shell提示符下輸入,或者在shell腳本中加入這條語句。注意,在等號(=)的前后都沒有空格。區(qū)別shell變量的名稱和shell變量的值十分重要。當(dāng)一個賦值語句執(zhí)行的時候,變量的值才會被設(shè)定
例如
TERM=70092
這會告訴shell記住TERM這個名稱,并且在TERM變量的值被要求的時候,返回70092。
變量名限制
變量名必須由字母開始可以包含字母,數(shù)字。下劃線,變量名所包含的字符的數(shù)量沒有限制。
6.9 兩個重要的變量
PATH變量
??-shell搜尋你鍵入的命令所在位置的一個目錄的列表
TERMb變量
??-描述你的終端類型和屏幕尺寸(為你運(yùn)行的程序需要)
?$ env
?...
?PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin
?$TERM=70092
?$
?$ tset
?Erase is Backspace
?kill is Ctrl+U
?$
PATH變量
是shell在尋找命令所要查找的路徑的一個列表。它使我們可以簡單地鍵入一個命令名而不需要在前面加上一個完整的一個路徑列表。(例如,vi代表/usr/bin/vi)。以下是一個默認(rèn)的PATH變量的例子:
PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin
這意味著當(dāng)你鍵入一個命令的時候,shell會在路徑/usr/bin中查找,然后是/usr/contrib/bin,等等,直到找到這個命令,或者找完這些目錄都沒有發(fā)現(xiàn)這個命令。如果沒有找到這個命令,會有一個
command: not found的錯誤信息出現(xiàn)在屏幕上。
TERM是一個描述你的終端類型的環(huán)境變量。為了許多的命令能正確運(yùn)行,它們需要知道你使用的終端類型。例如,ls
命令需要屏幕有多少列,更多的需要知道屏幕有多少行,vi為了正確地工作,同時需要知道你的終端的行與列的數(shù)目和關(guān)于你的終端更多的信息。終端的類型被設(shè)置成為終端的型號的數(shù)字。(例如2392,70092,等等)
設(shè)置終端變量的默認(rèn)方法是使用以下的方法:
TERM=(hp)
你的系統(tǒng)管理員也許已經(jīng)設(shè)置好你的系統(tǒng),所以系統(tǒng)不會詢問你的終端類型。在這種情況下你可以使用env命令來檢查TERM環(huán)境變量的值。如果你使用的工作站只有一個顯示器,TERM變量的值就很可能是正確的,不需要更改。
如果你的終端在你使用more 或者vi
的時候出現(xiàn)異常,請檢查TERM變量,如果設(shè)置正確,執(zhí)行tset命令。這個命令會使用TERM變量中的值來重新設(shè)定你的終端類型。
6.10 常用的變量賦值
黑體字為你要定義的變量。
EDITOR=/usr/bin/vi ?????使用vi作為行編輯器
ENV=$HOME/.shrc ???????在shell啟動的時候執(zhí)行$HOME/.shrc文件
FCEDIT=/usr/bin/vi ?????在先前的命令行開始vi編輯線索。
HOME=/home/user3 ??????指明你的登錄的目錄
~(波浪符號) ??????????在POSIX shell中等同于你的HOME目錄
HISTFILE=$HOME/.sh_history ?存儲所有的鍵入的命令的文件
LOGNAME=user3 ????????指明你的登錄標(biāo)識或是用戶名。
MAIL=/var/mail/user3 ????指明你的系統(tǒng)郵箱
OLDPWD=/TMP ?????????指明你所進(jìn)入的前一個目錄
PATH=/usr/bin:$HOME/bin ??指明查找命令的路徑。
PS1= ???????????? 指明你的主提示符。
PS1=’[!] $’ ????? ??在提示符中顯示命令的行號
PS1=’$PWD $’??????? 在提示符中顯示當(dāng)前的工作路徑(注意:必須
使用單引號。
PS1=’[!] $PWD $’ ?????在提示符中顯示行號和當(dāng)前工作目錄
PWD=/home/user3/tree ??? 指明你的當(dāng)前所在的目錄。
SHELL=/usr/bin/sh ?????指明你的命令解釋程序
TERM=2392a ?????????指明你使用的終端的類型,啟動的時候使用命令eval ‘tset –s –Q –h
‘系統(tǒng)會自動讀取/etc/ttytype文件,并使用恰當(dāng)?shù)亟K端類型來映射你的終端的端口。這在你的系統(tǒng)聯(lián)接有不同型號的終端的時候十分有用。
TMOUT = 300???????? 如果在指定的時間內(nèi)沒有命令或回車鍵入,shell會中止或者超時
TZ=EST5EDT?????????定義系統(tǒng)時區(qū)以顯示正確的時間
6.11 在登錄的時候發(fā)生了什么?
當(dāng)你坐下來開始在系統(tǒng)中工作,你會在屏幕上看見login:
提示符。當(dāng)你鍵入你的用戶名,系統(tǒng)會讀取你的用戶名,并且提示你輸入密碼。當(dāng)你鍵入你的密碼,系統(tǒng)會檢查你的用戶名和密碼(使用/etc/passwd文件)。如果你鍵入的用戶名和密碼是正確的,系統(tǒng)會讓你進(jìn)入到你的home目錄,并且系統(tǒng)會為你啟動shell。我們已經(jīng)看到了每一次我們登錄的時候發(fā)生的事情。我們的問題是-當(dāng)shell啟動的時候,系統(tǒng)究竟做了什么?
1.getty
a.顯示/etc/issue中的內(nèi)容
b.出現(xiàn)登錄提示符
c.運(yùn)行登錄過程
2.Login
?a.確認(rèn)用戶名和密碼的正確性。
?b.將用戶放在home目錄下
?c.運(yùn)行用戶的shell
3. shell
?a. 執(zhí)行/etc/profile文件(POSIX,Bourne,和Korn shell) 或者是 /etc/csh.login(C
shell)
?b. 執(zhí)行用戶home目錄下的.profile 或者.login文件
c.執(zhí)行用戶home目錄下的.kshrc文件(POSIX和Korn
shell)。如果用戶創(chuàng)建了這個文件或是在ENV變量中設(shè)置.kshrc在.profile文件中。
?d.出現(xiàn)shell提示符
一旦shell開始運(yùn)行,他會從系統(tǒng)命令文件/etc/profile中讀取命令執(zhí)行.用戶無論在什么時候登錄和啟動一個shell,這個文件都會被讀取,然后shell會讀取你自己的.profile文件。這兩個shell腳本被用來定制一個用戶的環(huán)境。
/etc/profile中設(shè)置了系統(tǒng)中每個用戶的基本的環(huán)境。而.profile文件更多的是定制你特殊的需要。因?yàn)槊恳粋人都會使用/etc/profile文件,所以系統(tǒng)管理員有責(zé)任維護(hù)這個文件。
當(dāng)這兩個程序都完成后就會出現(xiàn)shell提示符。
6.12 shell啟動文件
Korn(/usr/bin/ksh)?????????.profile
?????????????????? ?.kshrc
Bourne(/usr/old/bin/sh)?????? .profile
POSIX(/usr/bin/sh) ???????? .profile
???????????????????.kshrc
Restricted(/usr/bin/rsh,?????.profile
/usr/bin/rksh)
C(/usr/bin/csh)?????????? .profile
???????????????????.cshrc
系統(tǒng)在配置你的線程的時候通常需要一些環(huán)境變量(例如:PATH,EIDTOR.)。正如你已經(jīng)看到的,它們必須在你每次登錄的時候定義。.profile文件和.kshrc文件十分有效。它們是簡單的shell腳本文件,可以用來定制你的環(huán)境變量,定義別名,在登錄時執(zhí)行程序。由于POSIX
shell 是起源于Korn shell,而Korn shell又是起源于Bourne shell,所以,POSIX shell
支持同樣的配置文件。
.profile
任何想要定制由系統(tǒng)管理員提供的默認(rèn)環(huán)境的用戶都可以創(chuàng)建或修改.profile文件。這個文件通常定義或定制了環(huán)境變量,設(shè)置用戶的終端,在登錄過程時執(zhí)行如date這樣的程序。用戶的應(yīng)用同樣也可以通過在.profile中的exec
applicationname來啟動。在這種方式下,用戶不會存取到shell提示符,并且,當(dāng)應(yīng)用程序退出,用戶同時會退出登錄。
/etc/profile
這個文件是一個對系統(tǒng)中的所有用戶都有效的初始化文件,前提是這些用戶使用的是Bourne,Korn,或者POSIX
shell.。系統(tǒng)管理員可以定制這個文件來提供所有的用戶的一個一致的用戶環(huán)境。普通的用戶一般沒有權(quán)限更改這個文件,用戶定制他們自己的環(huán)境
只能通過自己的.profile和.kshrc文件
.kshrc
POSIX和K
shell都有一個可選的叫做.kshrc的配置文件。它的作用同.profile一樣是配置你的用戶環(huán)境,同.profile不同的是,.kshrc是在每次你啟動一個新的shell時被讀取。而不僅僅是在登錄的時候。這種方式允許在每次你啟動一個新的shell地時候設(shè)置你的別名或甚至提示符。在象X11
windows這種環(huán)境中,你可能同時運(yùn)行幾個shell,你可以使用.kshrc文件,這樣,每一個shell看上去都是一樣的。
.kshrc這個文件名不是一個必須的文件名。當(dāng)你激活一個shell,它會通過ENV這個變量來索引這個文件。這個文件通常都是.kshrc,但它也可以使用其他的名字。
ENV=~/.kshrc
export ENV
這會告訴K shell你使用你的home目錄下的.kshrc文件,現(xiàn)在就可以在..kshrc中加入你的別名和命令。
如果你同時使用Bourne 和POSIX shell,你可以存儲POSIX shell的環(huán)境變量到這個文件中,因?yàn)锽ourne
shell不會讀這個文件。
.cshrc 和 .login
當(dāng)你使用C shell作為你的登錄的shell的時候,C shell 會在你的home
目錄下找一個.login地文件。如果找到,在shell提示符出現(xiàn)之前,這個文件中的命令就會被執(zhí)行。這和POSIX,Korn,和
Bourne shell中的.profile的用法完全一樣。如果文件存在,文件.cshrc中的命令也會被執(zhí)行。
6.13 shell內(nèi)部命令和unix命令
shell內(nèi)部命令是內(nèi)建在shell中的命令
例如:
?cd
?ls
?pwd
?echo
unix命令存在在/usr/bin下。
例如:
?more
?file
一些“內(nèi)部”命令同樣可以作為“單獨(dú)”的命令使用。
系統(tǒng)使用PATH變量來確定UNIX命令的位置
一些你通過鍵盤鍵入的命令是系統(tǒng)中的一個文件,例如在/usr/bin下的文件,這些命令都是unix命,但由許多的命令,例如 cd ,pwd
,echo 實(shí)際上是shell內(nèi)部自帶的命令。這些命令在unix文件系統(tǒng)中并不存在,這些命令就叫做shell內(nèi)部命令。
由于unix命令可能存在在幾個目錄下,shell必須知道到什么地方去找這些命令。PATH變量就是shell查找命令的目錄的位置。
Unix命令可以與shell內(nèi)部命令同名,為了使用這些命令,用戶必須在這些命令前加上其絕對路徑名,以免同同名的內(nèi)部命令沖突。
6.14 查找命令-whereis
UNIX命令主要存在在四個目錄:/sbin,./usr/bin,/usr/local/bin,和/usr/contrib/bin。Whereis
命令主要在這些目錄下查找命令所在的位置。許多的用戶在他們的登錄目錄下有自己的bin 目錄。whereis
命令不會去查找這些路徑。有時你忘記命令的路徑和命令的手冊的位置。UNIX系統(tǒng)通過whereis 命令來定位命令和手冊在系統(tǒng)中的位置。
Whereis 命令接受單一的參數(shù)就是命令的名字。它返回的結(jié)果是可執(zhí)行代碼的位置和命令的手冊頁。
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u2/84425/showart_2069312.html |
|