Arganzheng's Blog

stay hungry, stay foolish

使用rsync进行文件同步

以前一直用scp,但是rsync更强大。最常见的应用场景是需要将开发机的代码发布到测试机上编译和运行,确认没有问题之后再提交svn。以前的standalone发布程序做的其实就是这样的事情,里面的核心发布函数就是利用了rsync: Release(){ echo_red `nchar = 25` "[$APP]:Press any key to release on $CONTAINER, or Ctrl+c to quit !" `nchar = 25` read _xx ssh $CONTAINER "mkdir -p $TARGETDEPLOYDIR" rsync -avz --delete $SOURCEDEPLOYDIR/...

shell模块的另一种组织方式

在前面一篇文章里shell如何模块化和复用——shell深入学习,我介绍了一种shell的模块化做法,但是在实际的代码中我估计很少人会这么处理,相反,有另一种组织方式(或者称为模块化方式吧)在一些开源代码中可以见到,感觉更符合shell的语言特性。 由于shell的source语句(. 语句)本质上是在当前的shell进程中执行script脚本文件,所以如果这个脚本文件中不是单纯的定义子函数被导入上调用(也就是我们所谓的子模块或者库),那么他就类似于VM中的一个子control,仅仅是为了避免重复代码,而且往往需要导入多次(因为导入就是为了执行该子shell)。而对于作为子模块的子shell文件,我们其实是希望他只被导入一次的(因为我们是要导入他定义的子函数)。这...

shell如何模块化和复用——shell深入学习

基本上所有的编程语言都支持模块化,以达到功能复用的效果。比如java和python的import xxx。C/C++的include。那么shell支持模块化吗? shell本质上并不支持模块化,但是有些机制可以使它达到类似的效果。 一些背景知识 首先要了解有两种方式可以执行一个shell脚本: 1. 一种是新产生一个shell,然后执行相应的shell脚本 方法是在scripts文件开头加入以下语句 #!/bin/bash 一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。 也可以直接在命令行中指定shell类型,如: $ sh script文件 2. 一种是在当前shel...

python2.x的一个需要注意的地方

今天晚上过来跑图片dump python脚本,无意中发现python的OptParse的一个小“问题”,很容易中招,就像python的range一样,不小心就容易出问题。 程序主体逻辑如下: def main(): p = optparse.OptionParser(description=”dump summ img in a dir that matches the given patten”, prog=”dump_summ_img”, usage=”%prog dir”) p.add_option('--destdir', '-o', action="store", dest="destdir", d...

ifttt模式语言——sed和awk深入学习

引子——一些思考 sed和awk能否实现这样一类问题:假如匹配了一个pattern,对下面的记录行采取这样的action,直到另一个pattern满足。 也就是说: pattern1 ==> begin action {action} pattern2 ==> end action 有点麻烦,但是并不是不能做到。因为sed和awk都是ifttt模式,上面的模式其实其实可以分解为两个ifttt: if pattern1, then do the action; 此时的action context就是pattern1开始的那一行。 if pattern2, then stop the action; 这样,将action的context限...

AWK学习与实战

前言 AWK的pattern { action }语法结构已经影响到很多后来的东东,当然更早的是grep和sed。 以至于现在有个网站叫做ifttt,其名字意思就是if this then that,做的就是这个事情。虽然这门语言有点过时,还是有必要介绍一下。 What is AWK? An awk program is a sequence of patterns and actions that tell what to look for in the input data and what to do when it’s found. Awk searches a set of files for lines matched by any of the ...

shell如何实现ssh免密码登陆

在shell中经常有这样的情况,一个可以写成脚本的程序,本来你可以执行它然后去星巴克喝咖啡,但是由于里面有些交互行命令需要你回答,如login某个服务器,或者输入svn密码,等。但是这样都是我们可以预料的,如果能将我们的回答先存放在某个地方,让shell在那个时候自动去读取这个答案,那么他就可以继续执行了。google了一下,发现有个命令还是不错的,叫作expect,man了一下,有如下描述: In general, Expect is useful for running any program which requires interaction between the program and the user. All that is nece...

shell语言之我见

2011-05-08 星期天 热 shell是一门非常简单而原始的语言,容易入手,它最常见的作用是将一连串的unix命令(cd, ls , find, etc.)串起来。所以只要你对这些命令比较熟,你只要熟悉shell的一点点语法和特性就可以马上写出一个小型甚至中型的shell程序了。 最近用shell写了好几个脚本处理一些svn相关操作(拉N个分支,合并N个分之,提交N个分之,等),也算是对shell有比较深入的认识,这里谈谈个人的看法。 我认为shell是一门面向文本的语言。这主要取决于shell的不支持用户自定义类型(struct和class),而它本身的数据类型又少的可怜(只支持两种类型:int和string,有些shell支持其他类型,如bash支持...

关于文件描述符和句柄

2011-03-31 星期四 晴朗 今天jojo突然问我们:“什么叫做句柄?”。我对句柄不是很清楚(Win32下没有怎么编过程),但是我对文件描述符是比较清楚的。但是我觉得应该是差不多的,所以我就这么回答她了:“句柄应该类似与Unix下的文件描述符,是一个内核对象标识。根据这个标识,进程可以访问相应的内核对象。至于为什么不直接返回内核对象地址,原因我想有两个: 内核对象驻留在内核地址空件,而进程没有权限访问内核地址空间。C标准库中的File对象返回指针,那是因为它是用户库。 不给定内存地址,有利于内核(用户进程也一样)做内存空间调整和优化,而保持对外部透明。很多数据库存储引擎,就是这么实现的——一种称之为slotted page的技术。 晚饭的时候跟...

sed实战

实战1. 删除空行(包括由空格组成的空行) 首先要隆重介绍我们的测试文件,因为这是非常特殊的文件: forrest@ubuntu:~/Public$ cat -v wuhui.txt 1^M ^M 2^M ^M 3^M ^M 4^M ^M 5^M ^M 6^M ^M ^M 我用cat -v选项,显示不可见字符。^M是换行的意思。不过这是不正常的。正常的文件换行符用-v也是看不到的。 这里如下四种空行: 单独一个换行符 N个空格+换行 N个TAB+换行 N个(空格&TAB)+换行 对于...

×