• py实现一个shell


    @

    ref

    我们要实现的一个 shell 类似物

    参考了:

    https://linux.cn/article-7624-1.html

    https://zcfy.cc/article/create-your-own-shell-in-python-part-ii

    git hub code :

    https://github.com/supasate/yosh/blob/master/yosh/shell.py

    notes

    在这里插入图片描述

    code

    在这里插入图片描述

    shell.py

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    import sys
    import shlex
    import os
    
    from buildins import *
    
    build_in_cmds = {}
    
    def register_command(name, func):
    	build_in_cmds[name] = func
    
    def init():
    	register_command("cd", cd)
    	register_command("exit", exit)
    
    
    
    def shell_loop():
    	# start the loop here
    	status = SHELL_STATUS_RUN
    
    	while status == SHELL_STATUS_RUN:
    		## show the prompt
    		sys.stdout.write('F9500(PE)>')
    		sys.stdout.flush()
    
    		# 读取命令输入
    		cmd = sys.stdin.readline()
    		# 切分 命令
    		cmd_tokens = tokenize(cmd)
    
    		# 执行这个切分好的命令
    		status = execute(cmd_tokens)
    
    # 魔法切割一行命令
    def tokenize(string):
    	return shlex.split(string)
    
    # 执行 execute
    def execute(cmd_tokens):
    	if cmd_tokens:
    		cmd_name = cmd_tokens[0]
    		cmd_args = cmd_tokens[1:]
    
    		if cmd_name in build_in_cmds:
    			return build_in_cmds[cmd_name](cmd_args)
    
    	if cmd_tokens[0] == 'createinterface':
    		print "F9500 create a new interface for you"
    		
    	return SHELL_STATUS_RUN
    
    def main():
    	init()
    	shell_loop()
    
    
    if __name__ == '__main__':
    	main()
    

    buildin

    在这里插入图片描述

    在这里插入图片描述
    文本,从左到右:代码如下:

    from cd import *
    from exit import *
    
    
    ---
    
    import os
    
    SHELL_STATUS_STOP = 0
    SHELL_STATUS_RUN = 1
    HISTORY_PATH = os.path.expanduser('~') + os.sep + '.yosh_history'
    
    ---
    
    
    from constants import *
    
    def exit(args):
        return SHELL_STATUS_STOP
    
    
    ----
    
    import os
    from constants import *
    
    
    def cd(args):
        if len(args) > 0:
            os.chdir(args[0])
        else:
            os.chdir(os.getenv('HOME'))
        return SHELL_STATUS_RUN
    
    
    
  • 相关阅读:
    Linux 命令集合
    vsftpd 创建虚拟用户
    Java Web Socket
    Linux 命令集合
    YII 1.0 上传文件
    YII 1.0 扩展第三方类
    YII 1.0 发表文章用到的小物件
    YII 1.0 增删改查
    mysql 日志
    YII 1.0 小功能总结
  • 原文地址:https://www.cnblogs.com/paulkg12/p/12450406.html
Copyright © 2020-2023  润新知