2009年二月月 发布的文章

“扶正”Bash Shell

近日,Bash Shell正式发布了其4.0版本,该版本可以看作3.x的bugfix版,同时增加了诸如"Associative Arrays"等新特性。在Bash Shell的官方站点你可以下载到最新的4.0版本,不过在GNU的Bash主页上,似乎还找不到4.0版本的所在。Bash作为Linux系统默认Shell,一直受到广泛关注,而且它还是目前几大Shell(Bourne Shell, C ShellKorn Shell、Bash Shell)里唯一还继续维护和更新的Shell版本了,目前其主要维护者是Chet Ramey,Bash的两个原始作者之一。

部门内部一直使用C Shell作为Unix账户的默认Shell,估摸着一切源于“继承性”。以前对Shell的关注不多,认为只是工具,用什么Shell都无所谓;近来一直在关注工具使用的高效性,Bash Shell也就再次进入我的视野,花了三天时间将《学习Bash》这本书通读了一遍,收获颇丰,纠正了我以前很多对Shell错误的理解,也加深了我对Shell的认识。《学习Bash》这本书市面上已经绝版了,各大网购站点都亮出“缺货”字样。其英文原版是Oreilly的“Learning the bash shell 2nd edition”,而目前最新版本则是“Learning the bash shell 3rd edition”,内容变化不大,没有中文译版,可以到网上下载电子版阅读。

Bash在命令行编辑下支持的Emacs和Vi模式让我使用起来很得心应手,这样即使在命令行下我也可以使用VI的快捷键对命令行进行编辑,手指可以完全不用离开键盘的常用操作区。这也直接促使我将Bash“扶正”。昨天已经让管理员把我的Unix帐户从C Shell正式换成了Bash Shell。

现在也逐渐认识到:深入理解Shell脚本更有助于你深入理解Unix的文化,对在Unix上写程序也大有裨益。

“中国人史纲”和ThinkPad红点背包

“中国人史纲”和“ThinkPad红点背包”,这两个八杆子也打不到的东西被我搁在一起放到本篇文章的题目中,这都源于近期的网购

上下班一直拎着公司配发的又重又难看的单肩包,早有换掉它的计划。平时忙,虽说有三好街这样的电脑配件集中的"大集市",但也很少去“逛”,记忆中应该有一年多没有去过三好街了;在网购越来越“红火”的今天,我也选择了后者。上周六在“京东商城”看到了一款TARGUS代工的ThinkPad双肩红点包,价格比卓越网便宜很多,而且居然也比淘宝网便宜,遂动了心,价钱也不贵,样子还过得去,遂下了订单。这是我第一次在京东购物,与卓越网比起来,京东的购物流程比较繁琐,网上支付宝支付后居然还需要将订单号提供给京东财务核实。包包从北京送到这里快递费6元,“快递”了5天后,终于于今天到达。包是正品没有问题,看起来也比我预想的要精致许多、小巧许多,分量也不重,对这件包我还是比较满意的。

ThinkPad背包

我的ThinkPad双肩红点包(粗犷型双肩背包30R6345)

我一直认为自己比较“孤陋寡闻”,知道有柏杨这位人文大师,那还是在去年网络上报道的“柏杨逝世”的消息时。年初给今年定下的目标之一就是“读史”。“平民著史”之大家柏杨的作品自然不能放过,在豆瓣的排行榜上“中国人史纲”这套两册书也是名列前茅。在卓越网这套书打了5折的折扣,还有一张介绍柏杨的光盘,觉得还是很合算的,就买下了。昨天这套书就送到了,晚上临睡觉前翻看了几页,第一印象很好,由于尚未深读,这里不敢妄加评价。

中国人史纲

柏杨的“中国人史纲”

随“中国人史纲”一起买下的还有一本《黄帝内经·养生智慧》,北京中医药大学副教授曲黎敏著的,上过“名家论坛”。最近身体欠佳,买这本传统医学养生之书就全当心理安慰了。

CSCOPE使用中问题小解

拥有了某种工具,往往不等于就能使用好这种工具。拥有工具简单,用好工具、发挥出最大作用则较难。CSCOPEVIM的使用者有了与SourceInsight"平起平坐“的机会,但是能否将CSCOPE的功能发挥出来还要看你是如何使用它了。

自从VIM”重装上阵“以后,我一直在使用CSCOPE。在使用过程中还是发现了一些”别扭“的事情。一般我会在一个大型Project的源代码的顶层目录使用CSCOPE -Rbq来生成cscope.out文件,如果你在cscope.out所在目录执行VIM的话,VIM会优先将cscope.out作为”符号交叉索引库“(与ctags相比),但是如果你在某个子目录下执行VIM进入编辑状态的话,因当前目录没有cscope.out,所以VIM无法加载cscope.out文件,也就无法在文件间跳转。而必要时你还需要手动执行命令行:cs add {TOP_LEVEL_PATH}/cscope.out才能连接到cscope,发挥其功用。

还有一种情况,如果你有两份基本相同的代码库,其中一份A建立了cscope.out文件(在A的顶层目录使用CSCOPE -Rbq),而另一份B没有建立,当使用B查看代码或编写代码时,手动add A库的cscope.out文件,然后打开B库子目录的一个文件,找到一个符号,用ctrl+]进行跳转,VIM会列出符号列表,当你选择一个时,VIM却提示你“E429: File xx/yy.h does not exist”,原因很简单,就是Cscope以相对路径存储了符号的位置,你从B库的工作目录下当然跳不过去了。

现在我们就要解决这两个问题,我们要做到:
1) 无论在任何目录下执行VIM,VIM都会自动加载当前阶段常用的cscope.out,而无需手动加载;
2) 让cscope.out内的符号以绝对路径的形式存储,这样无论在何处进入VIM,都能跳转到相应的符号定义的文件中;

其实解决上述两个问题的方法有多种,这里只是先说说我的一种方法,估摸着还不是最优的。在cscope官方有篇文章“Using Cscope on large projects”,里面关于cscope.out生成的方法可以解决第二个问题,即使用cscope.files来生成cscope.out。cscope.files中的内容很简单,就是文件列表,将你要进行扫描的所有文件的路径cscope.files中,然后执行cscope -bqk即可得到cscope.out。如果你要解决问题2,那你就将要进行扫描的文件的绝对路径名加入到csccope.files中。用find命令可以轻松帮你做到这一点。这里将这个工作放到了一个shell脚本中去完成了,脚本具有一定的通用性(我的脚本水平:菜鸟级^_^):
/* gen_cscope_files.sh */
#! /bin/bash

TARGET='/export/home1/username/cscope_db/cscope.files'
gen_cscope_files_usage() {
        echo "gen_cscope_files.sh 源码顶层目录(绝对路径) 待扫描子目录1 [待扫描子目录2] … [待扫描子目录N]"
}

if [ -z ${1} ]; then
        echo "请输入起始目录!"
        gen_cscope_files_usage
        exit 1
fi

if [ ${1:0:1} != '/' ]; then
        echo "请输入起始目录的绝对路径形式!"
        gen_cscope_files_usage
        exit 1
fi

if [ ${#} -lt 2 ]; then
        echo "请输入你要扫描的子目录列表!"
        gen_cscope_files_usage
        exit 1
fi

if [ -s ${TARGET} ]; then
        cat /dev/null > ${TARGET}
fi

for dir in $@
do
        if [ ${dir} != ${1} ]; then
                find ${1}/${dir} \
                -name "*.[hc]" \
                -print >> ${TARGET}
        fi
done
这样你只要选择好你的cscope.files的存放位置(在上面的脚本中是写死的,当然你也可以修改脚本,通过命令行参数传入cscope.files的存放位置),给gen_cscope_files.sh一个源码的顶层目录(绝对路径),再给出你要扫描的子目录列表即可,比如:gen_cscope_files.sh /export/home/username/proj/foo  include src

以上解决了问题2,那问题1呢?我们在.vimrc中做文章。以下代码保证了每次vim被执行后都会将上面生成的cscope.out加载。
if has("cscope")
        if filereadable("/export/home1/username/cscope_db/cscope.out")
                cscope add  /export/home1/username/cscope_db/cscope.out
        endif
endif

到目前为止,你在B库中在任意目录下打开的文件都可以找到相应符号的位置。




这里是Tony Bai的个人Blog,欢迎访问、订阅和留言!订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您喜欢通过微信App浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:



本站Powered by Digital Ocean VPS。

选择Digital Ocean VPS主机,即可获得10美元现金充值,可免费使用两个月哟!

著名主机提供商Linode 10$优惠码:linode10,在这里注册即可免费获得。

阿里云推荐码:1WFZ0V立享9折!

View Tony Bai's profile on LinkedIn


文章

评论

  • 正在加载...

分类

标签

归档











更多