Shell是操作系統(tǒng)核心和操作者之間的一層使用界面,,用來(lái)負(fù)責(zé)接收使用者輸入的指令,然后將指令解釋成核心能夠了解的方式, 傳給核心去執(zhí)行,
再將結(jié)果傳回至預(yù)設(shè)的輸出周邊,。目前流行的Shell有Bourne Shell,、C Shell、Korn
Shell,、tcsh和bash等,。Linux的標(biāo)準(zhǔn)Shell是采用bash。
uClinux默認(rèn)的和通常采用的Shell都是sash,,但uClinux 下的 sash
Shell功能很弱,,它不支持上下鍵翻查命令,不支持Tab鍵補(bǔ)齊,也不支持重定向,、管道,,以及export環(huán)境變量,還無(wú)法解釋腳本,。當(dāng)需要對(duì)
uClinux的Shell進(jìn)行改進(jìn)以增強(qiáng)它的功能時(shí),,便需要更換Shell。
uClinux下的shell uClinux操作系統(tǒng)是標(biāo)準(zhǔn)Linux的一個(gè)分支,,是專門針對(duì)沒(méi)有MMU(存儲(chǔ)管理單元)的CPU而配制的操作系統(tǒng),,并且專為嵌入式系統(tǒng)做了許多小型化的工作。目前uClinux常用的應(yīng)用程序庫(kù)是mC-libc和mClibc。 通
過(guò)make menuconfig來(lái)配置uClinux時(shí),,可以看到,,這里可供選擇的Shell有:sash、minix
-shell,、nwsh,、bash、Other,。其中sash對(duì)應(yīng)的代碼為uClinux-Samsung/user/sash,,minix-shell
對(duì)應(yīng)的代碼為uClinux-Samsung
/user/sh,nwsh對(duì)應(yīng)的代碼為uClinux-Samsung/user/nwsh,,bash對(duì)應(yīng)的代碼為uClinux-Samsung
/user/bash,,Other則表示可選擇其它的Shell,主要是指Busybox里面的幾個(gè)Shell,。其中minix-shell在mC-
libc和mClibc下都可以編譯通過(guò),,且都可以較好地使用,但功能不是很強(qiáng),;nwsh在mC-libc和mClibc下都可以編譯通過(guò),,但都工作不正
常,無(wú)法進(jìn)入命令行提示符,;bash則無(wú)論在mC-libc還是mClibc下都無(wú)法編譯通過(guò),,其結(jié)構(gòu)不適合uClinux。本文主要討論如何使用
Busybox中的Shell,。
Busybox中的shell Busybox最早為Debian
Linux的安裝盤所寫,,并將大量Linux下的工具集成到一個(gè)可執(zhí)行文件中。目前Busybox提供了100多個(gè)命令的功能,,但它的可執(zhí)行文件只有幾百
KB,,為嵌入式系統(tǒng)提供了一個(gè)比較完整而且體積較小的POSIX運(yùn)行環(huán)境。不過(guò)這些命令的參數(shù)選項(xiàng)要比原來(lái)完整的GNU命令少,。 Busybox中
集成進(jìn)去的Shell有以下幾個(gè),。①Lash:很小,加起來(lái)有10k,非常適合執(zhí)行命令,支持管道和重定向,,但不支持Bourne
Shell語(yǔ)法,,無(wú)法解釋腳本。②Hush:也非常小,, 18k左右,支持Bourne
Shell語(yǔ)法,,能夠很好地處理if/then/else/fi結(jié)構(gòu)語(yǔ)句,,但是處理不了像for/do/done或者case/esac等循環(huán)語(yǔ)句。
③Msh:加起來(lái)有30k左右,能夠處理for/do/done,、case/esac等循環(huán)語(yǔ)句,。只要是Bourne
shell能夠做的,Msh一般都能做到,,它的語(yǔ)法與Bourne Shell語(yǔ)法可能不完全相同,,但大多數(shù)Bourne
Shell語(yǔ)法都能被Msh解釋。Msh是用vfork來(lái)創(chuàng)建新進(jìn)程的,,所以適于uClinux操作系統(tǒng),。④Ash:在默認(rèn)配置下大約有60k左右,是
Busybox里最完整的Shell,,但無(wú)法在uClinux 上編譯通過(guò),。 綜上所述,Busybox里的Msh是目前uClinux下最好的Shell,。
uClinux下Shell的更換 uClinux下Shell的更換包括以下幾個(gè)步驟: 1. 修改uClinux-Samsung/user目錄下的makefile文件,,去掉Busybox項(xiàng)的注釋,這樣Busybox才能被編譯,。 2.修改uClinux-Samsung\user\busybox目錄下的makefile文件,,具體包括以下幾項(xiàng): (1) 由于要靜態(tài)編譯Busybox, 故將DOSTATIC = false 改為 DOSTATIC = true (2) 修改交叉編譯工具: CROSS_COMPILE=arm-elf- CROSS=$( CROSS_COMPILE) CC=$( CROSS_COMPILE)gcc AR=$( CROSS_COMPILE)ar STRIPTOOL=$(CROSS_ COMPILE)strip (3) 在該makefile文件中找到下面這一句: CFLAGS? += $(WARNINGS) $(OPTIMIZATION) -g -fomit-frame-pointer -D_GNU_SOURCE 去掉其中的 -fomit-frame-pointer 項(xiàng) (4) 在該makefile文件中找到下面這一句: sed "s:^:$$ROMFSDIR/bin/:" | env -i xargs rm -f; 去掉其中的env? -i 兩項(xiàng)。 3. make menuconfig,,重新配置uClinux內(nèi)核,。配置時(shí)選掉sash,然后選中以下幾項(xiàng): [*] BusyBox [*] shell [*] msh: Minix shell [*] MSH is /bin/sh 去
掉sash后,,就必須在Busybox里面把原來(lái)sash下常用的一些內(nèi)部命令編譯進(jìn)來(lái),,例如ls、cp
等基本命令,,這些原來(lái)是sash的內(nèi)部命令,,現(xiàn)在換了Shell,就必須選用Busybox里面的命令作為獨(dú)立的小應(yīng)用程序來(lái)使用,。本文中選擇了以下的常
用命令:clear,、mkdir、ping,、cat,、cp、ln,、ls,、ifconfig等,其中的ls和ifconfig命令下面的幾項(xiàng)功能需要全部選
擇,。 編譯的時(shí)候有個(gè)錯(cuò)誤,,是指msh.c中沒(méi)有_NSIG這個(gè)定義,,須在msh.c中加上這樣一句:#define? _NSIG? 255,之后可編譯通過(guò),。 編
譯后,,在uClinux-Samsung\user\busybox目錄下編譯出一個(gè)單個(gè)的獨(dú)立執(zhí)行程序,叫做
busybox.exe,。將編譯后的busybox.exe拷貝到uClinux-Samsung\romfs\home目錄下,,重新編譯內(nèi)核(不用再配
置內(nèi)核)。 4. 將編譯好的uClinux操作系統(tǒng)內(nèi)核下載運(yùn)行,,使用Busybox中的Msh Shell及各種命令,。使用Busybox
也很簡(jiǎn)單,只要建一個(gè)符號(hào)鏈接就可以了,。但是由于uClinux操作系統(tǒng)默認(rèn)的根文件系統(tǒng)romfs是只讀的,,只有/tmp和/var兩個(gè)目錄下是以虛擬
ram盤的方法實(shí)現(xiàn)的可讀寫目錄(系統(tǒng)掉電后,里邊保存的內(nèi)容全丟失),,故在進(jìn)行符號(hào)鏈接時(shí)必須鏈接到這兩個(gè)可讀寫的目錄下,,例如 ln -s
/bin/busybox /tmp/ls,那么,,執(zhí)行/tmp/ls的時(shí)候,,Busybox 就會(huì)執(zhí)行 ls 的功能,也會(huì)按照 ls
的方式處理命令行參數(shù),。 運(yùn)行成功后,,可以發(fā)現(xiàn)這個(gè)Shell不同于原來(lái)的sash,它的提示符為#,,支持上下鍵翻查命令,,但還不支持Tab鍵補(bǔ)齊功能。? 再找到uClinux-dist/config/config.in文件進(jìn)行編輯,,將該文件中的 bool 'sh: tab completion' CONFIG_USER_BUSYBOX_TAB_ COMPLETION bool 'sh: username completion' CONFIG_USER_BUSYBOX_USER NAME_COMPLETION 改為: bool 'sh: tab completion' CONFIG_USER_BUSYBOX_COMMAND_ TAB_COMPLETION bool 'sh: username completion' CONFIG_USER_BUSYBOX_COM MAND_USERNAME_COMPLETION 然后再make menuconfig,,選擇Busybox的Shell特性后重新編譯,再下載運(yùn)行,就可以實(shí)現(xiàn)Tab鍵補(bǔ)齊功能了,。 另外還可以增加Msh Shell的其它功能,,比如ls命令的以彩色顯示不同屬性文件的功能等,這里不再詳述,。
|