雖然bash shell是Linux發(fā)行版中最廣泛使用的shell,但它并不是唯一的選擇?,F(xiàn)在基本已經(jīng)了解了標(biāo)準(zhǔn)的Linux bash shell,知道了能用它做什么,是時(shí)候看看Linux世界中的其他一些shell了。接下來(lái)南昌APP制作開(kāi)發(fā)公司小編將會(huì)介紹另外兩個(gè)可能會(huì)碰到的shell,以及它們與bash shell有什么區(qū)別。
? ? ? ?1.什么是 dash shell
? ? ? ?Debian的dash shell的歷史很有趣。它是ash shell的直系后代,而ash shell則是Unix系統(tǒng)上原來(lái)的Bourne shell的簡(jiǎn)化版本。Kenneth Almquist為Unix系統(tǒng)開(kāi)發(fā)了一個(gè)Bourne shell的簡(jiǎn)化版本,并將它命名為Almquist shell,縮寫(xiě)為ash。ash shell最早的版本體積極小、速度奇快,但缺乏許多高級(jí)功能,比如命令行編輯或命令使用記錄功能,這使它很難用作交互式shell。
? ? ? ?NetBSD Unix操作系統(tǒng)移植了ash shell,直到今天依然將它用作默認(rèn)shell。NetBSD開(kāi)發(fā)人員對(duì)ash shell進(jìn)行了定制,增加了一些新的功能,使它更接近Bourne shell。新功能包括使用emacs
? ? ? ?和vi編輯器命令進(jìn)行命令行編輯,利用歷史命令來(lái)查看先前輸入的命令。ash shell的這個(gè)版本也被FreeBSD操作系統(tǒng)用作默認(rèn)登錄shell。
? ? ? ?Debian Linux發(fā)行版創(chuàng)建了它自己的ash shell版本(稱(chēng)Debian ash,或dash)以供自用。dash復(fù)制了ash shell的NetBSD版本的大多數(shù)功能,提供了一些高級(jí)命令行編輯能力。
? ? ? ?但令人不解的是,實(shí)際上dash shell在許多基于Debian的Linux發(fā)行版中并不是默認(rèn)的shell。由于bash shell在Linux中的流行,大多數(shù)基于Debian的Linux發(fā)行版將bash shell用作普通登錄shell,而只將dash shell作為安裝腳本的快速啟動(dòng)shell,用于安裝發(fā)行版文件。
? ? ? ?流行的Ubuntu發(fā)行版是例外。這經(jīng)常讓shell腳本程序員摸不清頭腦,給Linux環(huán)境中運(yùn)行shell腳本帶來(lái)了很多問(wèn)題。Ubuntu Linux發(fā)行版將bash shell用作默認(rèn)的交互shell,但dash shell用作默認(rèn)的 /bin/sh? shell。這個(gè)“特性”著實(shí)讓shell腳本程序員一頭霧水。
? ? ? ?每個(gè)shell腳本的起始行都必須聲明腳本所用的shell。在bash shell腳本中,我們一直用下面的行。
#!/bin/bash
? ? ? ?它會(huì)告訴shell使用位于/bin/bash的shell程序來(lái)執(zhí)行腳本。在Unix世界中,默認(rèn)shell一直是/bin/sh。許多熟悉Unix環(huán)境的shell腳本程序員會(huì)將這種用法帶到他們的Linux shell腳本中。
#!/bin/sh
? ? ? ?在大多數(shù)Linux發(fā)行版上,/bin/sh文件是鏈接到shel程序/bin/bash的一個(gè)符號(hào)鏈接。這樣你就可以在無(wú)需修改的情況下,輕松地將為Unix Bourne shell設(shè)計(jì)的shell腳本移植到Linux環(huán)境中。
? ? ? ?很遺憾,Ubuntu Linux發(fā)行版將/bin/sh文件鏈接到了shell程序/bin/dash。由于dash shell只含有原來(lái)Bourne shell中的一部分命令,這可能會(huì)(而且經(jīng)常會(huì))讓有些shell腳本無(wú)法正確工作。
? ? ? ?以后將逐步了解dash shell的基礎(chǔ)知識(shí)以及它跟bash shell的區(qū)別。如果你編寫(xiě)的bash shell腳本可能要在Ubuntu環(huán)境中運(yùn)行,了解這些內(nèi)容就尤其重要。
? ? ? ?2.dash shell 的特性
? ? ? ?盡管bash shell和dash shell都以Bourne shell為樣板,但它們還是有一些差別的。在深入了解shell腳本編程特性之前,將會(huì)帶你了解Debian dash shell的一些特性,以便讓你熟悉dash shell的工作方式。
? ? ? ?2.1 dash 命令行參數(shù)
? ? ? ?dash shell使用命令行參數(shù)來(lái)控制其行為。下列表中列出了命令行參數(shù),并介紹了每個(gè)參數(shù)的用途。
? ? ? ?除了原先的ash shell的命令行參數(shù)外,Debian還加入了另外一些命令行參數(shù)。 -E 和 -V 命令行參數(shù)會(huì)啟用dash shell特有的命令行編輯功能。
? ? ? ?-E 命令行參數(shù)允許使用emacs編輯器命令進(jìn)行命令行文本編輯。你可以使用所有的emacs命令來(lái)處理一行中的文本,其中會(huì)用到Ctrl和Meta組合鍵。
? ? ? ?-V 命令行參數(shù)允許使用vi編輯器命令進(jìn)行命令行文本編輯。這個(gè)功能允許用Esc鍵在普通模式和vi編輯器模式之間切換。當(dāng)你在vi模式中時(shí),可以用標(biāo)準(zhǔn)的vi編輯器命令(例如, x 刪除一個(gè)字符, i 插入文本)。完成命令行編輯后,必須再次按下Esc鍵退出vi編輯器模式。
? ? ? ?2.2 dash 環(huán)境變量
? ? ? ?dash shell用相當(dāng)多的默認(rèn)環(huán)境變量來(lái)記錄信息,你也可以創(chuàng)建自己的環(huán)境變量。將會(huì)介紹環(huán)境變量以及dash如何處理它們。
? ? ? ?(1). 默認(rèn)環(huán)境變量
? ? ? ?dash環(huán)境變量跟bash環(huán)境變量很像(參見(jiàn)第6章)。這絕非偶然。別忘了dash shell和bash shell都是Bourne shell的擴(kuò)展版,兩者都吸收了很多Bourne shell的特性。不過(guò),由于dash的目標(biāo)是簡(jiǎn)潔,因此它的環(huán)境變量比bash shell少多了。在dash shell環(huán)境中編寫(xiě)腳本時(shí)要記住這點(diǎn)。
? ? ? ?dash shell用 set 命令來(lái)顯示環(huán)境變量。
$set
COLORTERM=''
DESKTOP_SESSION='default'
DISPLAY=':0.0'
DM_CONTROL='/var/run/xdmctl'
GS_LIB='/home/atest/.fonts'
HOME='/home/atest'
IFS='
'
KDEROOTHOME='/root/.kde'
KDE_FULL_SESSION='true'
KDE_MULTIHEAD='false'
KONSOLE_DCOP='DCOPRef(konsole-5293,konsole)'
KONSOLE_DCOP_SESSION='DCOPRef(konsole-5293,session-1)'
LANG='en_US'
LANGUAGE='en'
LC_ALL='en_US'
LOGNAME='atest'
OPTIND='1'
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
PPID='5293'
PS1='$ '
PS2='> '
PS4='+ '
PWD='/home/atest'
SESSION_MANAGER='local/testbox:/tmp/.ICE-unix/5051'
SHELL='/bin/dash'
SHLVL='1'
TERM='xterm'
USER='atest'
XCURSOR_THEME='default'
_='ash'
$
? ? ? ?這和你的默認(rèn)dash shell環(huán)境很可能會(huì)不一樣,因?yàn)椴煌腖inux發(fā)行版在登錄時(shí)分配的默認(rèn)環(huán)境變量不同。
? ? ? ?(2). 位置參數(shù)
? ? ? ?除了默認(rèn)環(huán)境變量,dash shell還給命令行上定義的參數(shù)分配了特殊變量。下面是dash shell中用到的位置參數(shù)變量。
? ? ? ?所有dash的位置參數(shù)都類(lèi)似于bash shell中的位置參數(shù)??梢栽趕hell腳本中使用位置參數(shù),就和bash shell中的用法一樣。
? ? ? ?(3). 用戶(hù)自定義的環(huán)境變量
? ? ? ?dash shell還允許定義自己的環(huán)境變量。與bash一樣,你可以在命令行上用賦值語(yǔ)句來(lái)定義新的環(huán)境變量。
$ testing=10 ; export testing
$ echo $testing
10
$
? ? ? ?如果不用 export 命令,用戶(hù)自定義的環(huán)境變量就只在當(dāng)shell或進(jìn)程中可見(jiàn)。
? ? ? ?警告 dash變量和bash變量之間有一個(gè)巨大的差異。dash shell不支持?jǐn)?shù)組。這個(gè)小特性給高級(jí)shell腳本開(kāi)發(fā)人員帶來(lái)了各種問(wèn)題。
? ? ? ?2.3 dash 內(nèi)建命令
? ? ? ?跟bash shell一樣,dash shell含有一組它能識(shí)別的內(nèi)建命令。你可以在命令行界面上直接使用這些命令,或者將其放到shell腳本中。表中列出了dash shell的內(nèi)建命令。
? ? ? ?可能在bash shell中已經(jīng)認(rèn)識(shí)了上面的所有內(nèi)建命令。dash shell支持許多和bash shell一樣的內(nèi)建命令。會(huì)注意到其中沒(méi)有操作命令歷史記錄或目錄棧的命令。dash shell不支持這些特性。
? ? ? ?本文僅限內(nèi)部技術(shù)人員學(xué)習(xí)交流,不得作于其他商業(yè)用途.希望此文對(duì)廣大技人員有所幫助。原創(chuàng)文章出自:南昌APP制作開(kāi)發(fā)公司-百恒網(wǎng)絡(luò)