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