年年岁岁花相似,岁岁年年人不同。——linux课程初探
写在前面
记得大约两年以前第一次学习linux,当初的目的还仅仅是学习操作系统,后来慢慢开始写linux内核代码,慢慢学会重构与代码的维护。在娄老师课上感觉这些工具是如此亲切和熟悉,没错这些曾经被我抛弃甚至遗忘的国产“盗版” StackOverflow与github,如今已经发生了巨大的变化,我从博客园转到csdn也有两年了,也许今天我可能没有当时的执拗与倔强,所以我再次打开博客园的随笔写下这些,希望自己可以从“零”开始,以娄老师的教学路线为学习计划,虽然知识是旧的但思想永远是新的,相信一个学期走下来必定有所收获,再次感谢娄老师。
plus:附上我csdn的地址(读研以来好久没写过了)
开篇(从实习说起)
为什么要说实习呢,因为我实习的公司就是实验楼。。。当时的工作就是给一部分课程上传的教程找bug,看看能不能按照教程指引完成操作,所以上面很多内容都再熟悉不过了,linux的实验其实早就做过,当时实习的时候觉得这个平台比较小众,虽然自己很喜欢但没有什么实用性。今天来看可能我的判断不完全准确,上面的课程与分类越来越多,很多老师的制定教学平台就是实验楼,但依旧没有到达“火”的程度,我想可能是归咎于大数据与云计算的发展。为什么这样说呢,现在很多高校都有自己的虚拟化平台与云计算服务器(包括我们学校,可能很多人不知道罢了),很多的课程老师们可能不愿意发布到网上而是更喜欢班级的氛围,当然这只是我个人的推断。
中篇
实验我又认真地重做了一遍,具体实验我就不一张一张地截图了,我会将作业报告的链接附在下面(前10个作业),只针对一些问题简要说一下我的理解和认识。
命令执行顺序控制与管道
文件系统操作与磁盘管理
文件打包与解压缩
环境变量与文件查找
Linux 目录结构及文件基本操作
用户及文件权限管理
cheat命令
其实之前我查看帮助的方式比较特别,就是直接输入指令而不加任何参数,它会列出所有可能的参数,以sudo为例
如果输入cheat sudo的话会发现No cheatsheet found for sudo,可见cheat虽然方便但很多指令并没有,尤其是在第三方程序中,因此灵活使用man、--help和cheat才能将效率提升至最高。
环境变量
其实这一部分虽然常用但一直都有一点模糊,不论配置什么平台程序可能都离不开环境变量,那么什么时候应该添加系统环境变量,什么时候应该添加用户环境变量可能是很多人至今都分不清楚的(我也是其中之一),实验楼的实验并没有做具体说明(毕竟只是入门教程),但我觉得对于开发人员来说,这注定是一个不可回避的问题。
一般修改环境变量有三种方式:
1、直接用export命令(以编译器为例):
#export PATH=$PATH:/opt/au1200_rm/build_tools/bin
查看是否已经设好,可用命令export查看:
[root@shiyanlou]# export
declare -x BASH_ENV="/root/.bashrc"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="localhost.localdomain"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="zh_CN.GB18030"
declare -x LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*NaNd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD="/opt/au1200_rm/build_tools"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/opt/au1200_rm/build_tools/bin"
declare -x PWD="/opt/au1200_rm/build_tools/bin"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_AUTH_SOCK="/tmp/ssh-XX3LKWhz/agent.4242"
declare -x SSH_CLIENT="10.3.37.152 2236 22"
declare -x SSH_CONNECTION="10.3.37.152 2236 10.3.37.186 22"
declare -x SSH_TTY="/dev/pts/2"
declare -x TERM="linux"
declare -x USER="root"
declare -x USERNAME="root"
可以看到,环境变量已经设好,PATH里面已经有了我要加的编译器的路径。
2、修改profile文件:
#vi /etc/profile
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
让环境变量立即生效需要执行如下命令:
#source /etc/profile
3、修改.bashrc文件:
# vi /root/.bashrc
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
其中前两种修改的是系统环境变量,最后一种修改的是用户环境变量。
grep命令的技巧
一个优秀的软件架构师可能离不开grep命令,以我为例,我目前正使用caffe从事深度学习的开发,caffe源码较为庞大和复杂,如果不能快速定位的话会浪费大量时间。例如,在src/caffe/layer_factory.cpp(caffe基于工厂模式设计的)有一个宏调用:REGISTER_LAYER_CREATOR(Pooling,GetPoolingLayer),可能一眼看上去不知道它想做什么,那么可以在caffe的根路径运行如下命令:
grep -n -H -R "REGISTER_LAYER_CREATOR" *
结果见下图
尾篇
其实并没有写完,但由于导师项目较多,暂时就说这些吧,同时选修了娄老师的移动平台开发,更多内容请见移动平台开发提交的博客,里面对于linux上的部分操作进行了必要的补充。