常要在 Linux 下分析日志或其他类型的文件,基本用的命令也就 grep, awk, sed, cut, vim, cat, find, xargs, tail, more 或 less。本人工作平台为 Mac OS X, 而 Mac 下的 grep, sed, awk 的行为与 Linux 下的 GNU 标准的相应命令是有差别的, 所以我总是在 Mac 下安装 GNU 的 grep, sed, awk 等命令来替代系统默认的。
比如安装下面的命令$ brew install findutils gawk gnu-sed grep
以上会安装 GNU 的 find, awk, sed 和 grep 命令,使用时要加个前缀,如 gfind, gawk, gsed 或 ggrep,也可以设置别名或符号链接来替换掉系统的相应命令。
注:brew install coreutils会安装众多 Linux 下的基本命令替代品,ls, cat, cut 都在其中,使用它也是要加上前缀g, 如 gls, gcut 等。
以下 grep, find, grep, sed 以 GNU 的行为为准。 Read More
Bash 环境
多数时候我们用的是 Bash, 比如个人的 Linux 不愿去定制,远程服务器的由不得你去定制,所以就从 Bash 说起。
默认键绑定
emacs, 操作是ctrl-x, ctrl-e在默认的 Bash 环境下,只要在命令行中按下
ctrl-x, ctrl-e就会把当前命令的内容调入到环境变量$EDITOR指示的编辑器(默认为 emacs)去编辑,编辑后保存退出就会立即执行。如果未安装
Emacs编辑器,在按下ctrl-x, ctrl-e会得到如下提示[vagrant@localhost ~]$
-bash: emacs: command not found如果希望使用
vi来编辑当前命令,就需要设置EDITOR环境变量,比如在.bashrc中加入export EDITOR=vi
那么在命令行中按下
ctrl-x, ctrl-e使用打开vi来编辑当前命令。注:Emacs 要用
ctrl-x, ctrl-c, 再回答y, 命令保存到临时文中; 而 vi 的相应操作是:wq, 至少这个操作上 vi 要简洁些。 Read More- 最近玩弄 Jenkins 较多,构建服务器基本是 Mac OS 和 Linux,虽说有许多现成插件可用,但不敢不说 Execute Shell 这个东西都是即开即用,方便而灵活的。因此不断的要和 Shell 打交道,真正通用的的 Shell 自然是 Bash,在 Mac OS 下可发现自带了 zsh, ksh 和 tcsh,考虑到 Linux 还是 Bash 吧。
本人工作时用的是 Fish Shell,目前相当的脚本语言都可用来写 Shell 脚本,如 PHP, Ruby, Python, Perl,NodeJs 等,只是 Bash 的地位总难被替代,借句话说 Bash 的是拿来 “用” 的,而像 Ruby, Python 等做 Shell 是拿来 “编” 的,再就是 Bash 与 Linux 命令的亲缘性更强。
我也只会在实在用 Bash 太难于表达的时候才用其他脚本语言,如处理日期的运算,因 Mac OS 的 date 和 Linux 的 date 命令差异较大,不得已会选择有较强类型的 Ruby 等。
既然 Bash 要作为一个日常语言,那不妨作个备忘录,记录下那些常用的语法,控制结构。
1. if 条件语句 Read More 在 Vi 中如果想选取文本作为 Shell 命令来执行该如何做呢? 想法的背景是想在 Vi 中编辑 Shell 命令,主要是对参数的修改,然后直接选择执行,而不希望复制再贴到 Terminal 下看结果。方法其实很简单,用不着使用 VimShell,关键这个插件的安装还依赖于另两个插件。方法就是:
1. 可视模式选择文本,选择技巧, 按 v 逐字选择,j 从光标位置到行尾,最有用的莫过于大 V,以行为单位选择,所以按一下大 V 直接选中当前行
2. Shift+; 进到 :'<,'> 提示符
3. 输入 w !sh, 回车即可,要用 fish 就用 w !fish效果

原理(这个表述其实不怎么准确):其实进行的是一个管道操作,把选择的文本内容输送给 sh 执行,相当于
echo "echo 'Hello world'" | sh
如果想把执行结果输出到文件或是剪贴板, 就可借题发挥下了,比如 Read More
- 看资料介绍说 Windows 2000 以上的 SDK 提供了格式化逻辑驱动器的函数 SHFormatDrive, 这是一个外壳函数(Windows界面操作环境称之为外壳),从 shell32.dll 库导出,调用后会弹出一个格式化对话框,只有用户单击"开始"按钮后格式化才开始,使用时应包含头文件 shlobj.h
我都照做了,下载安装了 Windows XP SP2 的 SDK, 并配置在了 VC 的 include和lib目录中了,也把新SDK的目录调到了最上面,程序中也包含了 shlobj.h, 而且看到新的 SDK 的 shlobj.h 中确实有 SHFormatDrive 函数原型,可是当我使用 SHFormatDrive 函数编译时总提示我找不到这个符号。不知道发生什么问题了,留待以后有需求时再解决吧,反正就是预编译宏展开时,不是去 include 新的 SDK 的 shlobj.h 文件,include 的是 VC98 中的 shlobj.h 文件。 Read More
当我们在 Linux 下写了一个 Shell 做某些操作时,可能在一个终端运行了该脚本还没停止,然而又可能在另一个终端再一次执行了它,会有两个或多个实例在运行。或者是把这个 Shell 安排在 Cron 中,想让它每隔5分钟执行一次,有可能执行时间较长,正在执行当中,下一个5分钟的时刻到了,又在启动一次,这同样也会造成同一个 Shell会同时跑出多个实例来。
同时跑的多个实例就有可能对同一资源的操作造成数据的不可思异。这就要有一种方法来保证同一时刻同一脚本只能有一个实例在运行,借用很多软件的做法,比如 MySQL、Apache 等,在启动的时候生成一个临时的文件向后来者明确指示:有一个实例正在执行,不能执行第二个实例了。等到执行结束(可能被 Kill掉,被 Shutdown等),就把临时文件删除,以后可以运行新的实例了。
可以把某个 Shell 的执行权当作一个独占资源,只有获取锁(没有临时文件,并且建立它)时才有权执行它,执行完后释放锁(把临时文件删除)。 Read More