Python 實現(xiàn)一個mini shell

mini shell 的想法是通過python實現(xiàn)一個類似與linux的shell茵瀑。目前只支持4條命令 ls腕铸,cat惜犀,cd,history狠裹。(如果exit也算一條命令的話虽界,那就是五條)。
功能也類似與linux的shell涛菠,比如說運行這個python的程序之后莉御,輸入ls,它會返回當(dāng)前目錄的文件和文件夾俗冻。

通過這個小demo:

  1. 可以熟悉一個python下面os庫的一些函數(shù)礁叔,比如說如何獲取當(dāng)前工作目錄,主機名迄薄,用戶名等等琅关。
  2. 熟悉signal信號機制,比如我們在linux下面輸入ctrl+c 是掛起信號讥蔽,但是你在mini shell里面要屏蔽這個信號涣易,因為并不希望ctrl+c就退出當(dāng)前的minishell。
  3. 了解一下shell冶伞,在學(xué)習(xí)linux的時候新症,其實對shell剛接觸的時候,會有很大的恐懼感碰缔。其實我們在shell下輸入的命令账劲,比如cat,ls 他們的本質(zhì)都是可執(zhí)行文件,位于系統(tǒng)的bin目錄下面瀑焦。
    輸入ls -l腌且,就好像我們現(xiàn)在有一個可執(zhí)行文件叫 a.out,
//-l 相當(dāng)于是參數(shù),通過mian的argv獲得
./a.out   -l  

ls和自己寫得a.out 的區(qū)別在于榛瓮,a.out必須在當(dāng)前目錄下才可以執(zhí)行铺董,但是ls可以在任何目錄。你可以更改環(huán)境變量禀晓,把a.out的當(dāng)前目錄精续,加入到環(huán)境變量里面,這樣就可以了粹懒。(這也就是我們安裝java重付,python,mysql 等為什么要配置環(huán)境變量的原因了)

前面可以參考:
Python 在linux下獲得當(dāng)前工作目錄凫乖,主機名确垫,用戶名,操作系統(tǒng)平臺等信息http://www.reibang.com/p/5c294b5bc7b9

運行結(jié)果:


image.png

這是一個未完工的版本:
history的命令帽芽,exit命令還沒有實現(xiàn)删掀,也沒有寫成一個循環(huán)。有空來更新导街。實驗是參考實驗樓的一個python教程披泪。

解釋器的版本是python2.7,換成3也沒有問題搬瑰,稍微改一下print函數(shù)就可以款票。

#coding:utf-8
import os
import sys
import shlex
import getpass
import socket
import signal
import subprocess
import platform
import re


SHELL_STATUS_STOP = 0
SHELL_STATUS_RUN = 1
# 使用 os.path.expanduser('~') 獲取當(dāng)前操作系統(tǒng)平臺的當(dāng)前用戶根目錄
HISTORY_PATH = os.path.expanduser('~') + os.sep + '.shiyanlou_shell_history'

def ls(args):
    if len(args)>0:
        print os.getcwd()

def cd(args):
    if len(args) > 0:
        os.chdir(args[0])
    else:
        os.chdir(os.getenv('HOME'))
    print os.getcwd()
    return SHELL_STATUS_RUN

def getenv(args):
    #print 'test : ',args
    if len(args) >0:
        print(os.getenv(args))

def exit():
    #TO-DO
    print ('exit')

def history():
    #TO-DO
    print ('history')

def cat(arg):
    #TO-DO
    print ('cat')
    

def display_cmd_prompt():
    user=getpass.getuser()
    hostname=socket.gethostname()
    cwd=os.getcwd()
    base_dir=os.path.basename(cwd)

    home_dir=os.path.expanduser('~')
    if cwd==home_dir:
        base_dir='~'
    #sys.stdout.write("[%s@%s %s]$ " % (user, hostname, base_dir))
    #改變顏色
    sys.stdout.write("[\033[1;33m%s\033[0;0m@%s \033[1;36m%s\033[0;0m] $ " % (user, hostname, base_dir))
    sys.stdout.flush()



#這部分使用啦正則表達式來處理
def getsplit(str):
    # 其實就是按空格符將命令與參數(shù)分開
    # 比如,'ls -l /home/shiyanlou' 劃分之后就是
    # ['ls', '-l', '/home/shiyanlou']
    #res=re.split(r'\s',str)
    res=re.split(r'\s+',str)
    return res



def isgetenv(tokens):
    token=tokens[0]
    #print token
    if token.startswith('$'):
        getenv(token[1:])
        #print os.getenv(token[1:])
        return True
    else:
        return False

#構(gòu)建一個字典 字典裏面的value跌捆,指的是函數(shù)徽职,比如cd是cd函數(shù)
built_in_cmds = {}
built_in_cmds['cd']=cd
built_in_cmds['ls']=ls
built_in_cmds['cat']=cat
built_in_cmds['exit']=exit
built_in_cmds['history']=history


#to-do 這裏應(yīng)該寫成一個循環(huán) 

#輸出
display_cmd_prompt()
#等待輸入
cmd=sys.stdin.readline()
#切分
cmd_tokens=getsplit(cmd)
#cmd_tokens=[ls -l]
#cmd_tokens=preprocess(cmd_tokens)
if isgetenv(cmd_tokens)==False:
    #print cmd_tokens[0]
    #print cmd_tokens[1]
    cmd_args=cmd_tokens[1:]
    #print cmd_args
    if cmd_tokens[0] in built_in_cmds:
        #print cmd_args
        built_in_cmds[cmd_tokens[0]](cmd_args)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市佩厚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌说订,老刑警劉巖抄瓦,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陶冷,居然都是意外死亡钙姊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門埂伦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煞额,“玉大人,你說我怎么就攤上這事〔不伲” “怎么了胀莹?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長婚温。 經(jīng)常有香客問我描焰,道長,這世上最難降的妖魔是什么栅螟? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任荆秦,我火速辦了婚禮,結(jié)果婚禮上力图,老公的妹妹穿的比我還像新娘步绸。我一直安慰自己,他們只是感情好吃媒,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布瓤介。 她就那樣靜靜地躺著,像睡著了一般晓折。 火紅的嫁衣襯著肌膚如雪惑朦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天漓概,我揣著相機與錄音漾月,去河邊找鬼。 笑死胃珍,一個胖子當(dāng)著我的面吹牛梁肿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播觅彰,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吩蔑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了填抬?” 一聲冷哼從身側(cè)響起烛芬,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎飒责,沒想到半個月后赘娄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡宏蛉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年遣臼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拾并。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡揍堰,死狀恐怖鹏浅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屏歹,我是刑警寧澤隐砸,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站西采,受9級特大地震影響凰萨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜械馆,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一胖眷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霹崎,春花似錦珊搀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至派诬,卻和暖如春劳淆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背默赂。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工沛鸵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缆八。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓曲掰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奈辰。 傳聞我的和親對象是個殘疾皇子栏妖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Ubuntu的發(fā)音 Ubuntu瑟啃,源于非洲祖魯人和科薩人的語言趾徽,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,362評論 9 467
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,175評論 2 33
  • (一)基本命令 命令格式: 命令 參數(shù) 1.ls 顯示文件名翰守,等同于dos下dir命令 命令格式:ls [opti...
    飛羽孟德閱讀 1,894評論 0 3
  • 我們說:讀書學(xué)習(xí)要會跨界,要學(xué)各個基礎(chǔ)學(xué)科的自然原理和規(guī)律疲酌,這是我們的底層邏輯規(guī)律蜡峰; 但是在現(xiàn)實世界中了袁,我們要專精...
    小花的藍田閱讀 523評論 0 0
  • 這次旅行定的匆忙,只是一個念頭閃過湿颅,便再揮之不去载绿,那就一個人去看看吧。 出行前一天看攻略油航,定青旅崭庸,心里大概有了譜,...
    木南妮兒閱讀 191評論 4 3