- 求职 : Linux运维
- 论坛徽章:
- 203
|
本帖最后由 lyhabc 于 2016-11-09 17:57 编辑
bash代码简介:之前做过一个统计,shell源码大概有10万行,其中核心逻辑在1万多行,这也是分析的目标代码。剩下的包括引入的readline库(也是个开源库,处理输入的),yacc语法分析器生成工具(开源库,相信很多学过编译原理的都知道这东西),以及很多为提高用户界面友好性做得优化和辅助代码(比如!的历史操作)。
建议:在了解shell运行机制的同时,从软件设计的角度来看他,会发现有很多可以优化和改进的地方(当然,因为shell本身是从比较久远的年代发展而来,各种历史因素相关),特别是,读了下面内容的同学应该可以发现,命令解析那一块,用C++的OO思想可以合理的设计命令的类层次结构,大大简化代码量和逻辑,有兴趣的同学甚至可以自己动手写来试试替换掉这一部分。
一.启动过程
shell.c是shell主函数main所在文件。因此shell的启动可以认为从shell.c文件开始。main函数完成的主要工作流程是包括:
检查启动的运行环境(
是否通过sshd启动,
是否运行于emacs环境下,
是否运行于cgywin环境下,
是否是交互式shell,
是否是login shell等,
对系统进行内存泄露检查,
是否是受限shell),
读取配置文件(顺序为/etc/profile and( ~/.bash_profile OR ~/.bash_login OR ~/.profile)前面的存在不会读后面的),
设置运行需要的全局变量的值(当前环境变量、shell的名称、启动时间、输入输出文件描述符、语言本地化的相关设置),
处理参数和选项(即带有-c -s --debugger等参数和选项),
设置参数和选项的值(run_shopt_alist ()函数调用shopt_setopt函数设置选项的值;绑定$位置参数的值),
然后根据不同的启动参数进入以下不同分支:
如果是只进行参数扩展而不执行命令,调用run_wordexp函数扩展参数,然后调用exit_shell (last_command_exit_value)函数以上次命令执行的返回值为返回值退出。
如果是以-c参数模式启动shell,分为两种情况:一:如果是附带了字符串参数作为要执行的命令,则调用run_one_command (command_execution_string)执行-c附带的命令,参数command_execution_string保存-c后面附带的字符串命令值。执行完毕后调用exit_shell (last_command_exit_value)退出。二:如果是期待用户输入要执行的命令,则跳转到分支3。
将shell_initialized置为1表示shell初始化完成。调用eval.c中定义的函数reader_loop()不断的读取和解析用户输入,如果reader_loop函数返回,则调用exit_shell、(last_command_exit_value)退出shell。
转载自:https://www.qcloud.com/community/article/109
|
|