最近对shell中的OPTIND变量有些糊涂,想要查看文档弄清楚。可惜无论KSH还是BASH的手册中对这个变量都只是提了一下定义:OPTIND是一个索引,用于指向调用getopts函数时需要处理的参数,它的初始值为1。并没有展开论述,也没有范例。 如果只看这个定义的话,倒也很清楚。不过实际一测试,反而容易糊涂,尤其是碰到需要值(argument)的参数。请看下面一个简单的示例脚本: 在Linuxmint/ubuntu上: #!/bin/bash while getopts “abc:” flag do echo “$flag” $OPTIND $OPTARG done 这里我们的脚本可以处理3个参数,a, b和c,其中c参数需要跟一个值。实际运行结果如下: ┌[acheng@azalea]-(~) └> ./test.sh -a -b -c xd a 2 b 3 c 5 xd 调用getopts之前,OPTIND的值为初始值1,getopts被调用后返回第一个参数a,同时OPTIND变为2,因此第二次调用getopts时返回第二个参数b,同时OPTIND变为3。同理,第三次调用getopts时返回第三个参数c,同时OPTIND变为5,因为值xd也同样算一个数的。第四次调用getopts时,由于不存在第五个参数,getopts返回-1,while循环结束。 看起来很清楚,没什么好糊涂的。 下面我们再看一下把参数合并后脚本运行的结果: ┌[acheng@azalea]-(~) └> ./test.sh -abc xd a 1…
SED中的N命令的作用: 从输入文件中读入下一行,并附加到模式空间中,然后接着执行下面的SED命令。如果N碰到最后一行,则直接退出,不再执行后面的脚本。 传统的SED中,N命令遇到最后一行的话,SED直接退出,不输出最后那一行(模式空间中的内容),而GSED则输出。如果不是最后一行的话,则SED/GSED行为相同 用于测试的三行文本: ┌[acheng@vanilla]-(~) └> echo -e “test\necho\ntext” test echo text 当”echo”在最后一行时,sed直接退出,没有输出”echo”: ┌[acheng@vanilla]-(~) └> echo -e “test\necho” | sed ‘/^echo/ {N;}’ test 同样的情况,gsed则输出(OpenBSD上gsed需要另外安装。Linux上的sed和gsed多是一回事): ┌[acheng@vanilla]-(~) └> echo -e “test\necho” | gsed ‘/^echo/ {N;}’ test echo 当”echo”不为最后一行时,sed和gsed的输出相同: ┌[acheng@vanilla]-(~) └> echo -e…
mutt在命令行下默认是无法阅读HTML格式的邮件的。我们可以通过以下设置来告诉mutt使用第三方软件(w3m,需要另行安装)来查看HTML邮件。 1. 在自己的主目录下创建或编辑.mailcap文件,添加以下内容: text/html; w3m -I %{charset} -T text/html; copiousoutput; 2. 然后在mutt的配置文件.muttrc中添加以下内容: auto_view text/html # view html automatically alternative_order text/plain text/enriched text/html # save html for last
今天在网上看到了几个find命令的实战用法,觉得很不错。这里分享一下。 1. 查看当前目录下(包括子目录;find后面的那个点表示当前目录)共有多少个文件: $ find . -type f | wc -l 187534 2. 查看当前目录下(包括子目录)最新或最老的文件: # 最老的文件 $ find -type f -printf ‘%T+ %p\n’ | sort | head -n 1 2006-02-03+02:40:33 ./skel/.xemacs/init.el # 最新的文件 $ find -type f -printf ‘%T+ %p\n’…
Ubuntu 15.04上本来是有OpenSMTPD的安装包的,但是在我试图安装时报错,而且它用的是OpenSMTPD 5.4.2,比OpenBSD上的5.7.1版本低,于是我决定下载源码自己编译。 不过在编译之前先要安装一些软件: apt-get update apt-get install libevent libevent-dev automake autoconf bison libtool libdb 然后再编译、安装libasr库: wget https://opensmtpd.org/archives/libasr-1.0.2.tar.gz tar zxf libasr-1.0.2.tar.gz cd libasr-1.0.2 ./configure && make && make install 完成之后,开始编译opensmtpd wget http://www.opensmtpd.org/archives/opensmtpd-portable-latest.tar.gz tar zxf opensmtpd-portable-latest.tar.gz cd opensmtpd ./configure –with-asr=/usr/local make…
抽空看了一下Fish Shell的文档,发现它和其他shell的差别主要是增强或增加了一些方便用户的特性。主要表现在: 1.增强了TAB键自动补齐功能 会根据路径、文件名自动补齐,SHELL变量,常见命令、函数等 还可以使用complete命令为特定命令自定义补齐 2. 增加了自动建议 输入命令时,fish shell会根据$PATH变量的配置,命令行历史以及自动补齐功能提供自动建议(以灰色显示) 可以使用右箭头或ctrl+F接受自动建议 3. 改变了重定向标准错误的方式,使用^而非通用的 ‘2 > $file’: ^ filename (或 ^^ filename) 4. 自动加载函数的方式 5. 命令行语法高亮显示 当然还有其他的一些不同,目前还没有感觉到方便或者不便: a. 配置文件的名称和位置: ~/.config/fish/config.fish 或全局配置文件: /usr/share/fish/config.fish /etc/fish/config.fish b. 设置变量的方式: 要设置变量smurf_color 的值为blue, 用: set smurf_color blue c….
无意中发现了Fish Shell,对我来说是个全新的东东,也有很多看起来不错的特性。决定试一下。 不过OpenBSD上没有fish shell的软件包,需要自己编译。幸好编译的过程还算简单顺利。 先安装需要的工具: pkg_add -v gmake autoconf 安装autoconf的时候要选择2.60或更高的版本。 然后根据autoconf的版本设置变量AUTOCONF_VERSION: export AUTOCONF_VERSION=2.69 #我安装的是autoconf-2.69p1 接下来下载fish shell的源码包。我选择到github上下载。fishshell.com上应该也有,但是我打不开。 https://github.com/fish-shell/fish-shell/archive/master.zip 然后解压。我用的是7z (7zip): 7z x master.zip 解压后得到一个fish-shell-master文件夹。接下来编译。 cd fish-shell-master autoconf ./configure gmake gmake install # 需要root权 一切顺利的话,运行fish命令即可进入fish shell 至于fish shell的配置、特性等等,后面的博客中我们再聊(我也还没看完文档呢)
scrot是一个X环境下的命令行抓屏工具。注意是X环境,只开个终端是不行的。在OpenBSD上需要另外安装: ## 首先确保PKG_PATH变量已经设置好 $ echo $PKG_PATH http://ftp.jaist.ac.jp/pub/OpenBSD/snapshots/packages/amd64/ ## 安装scrot pkg_add -v scrot scrot的常见用法是: scrot -c -d 5 screen.png 其中”-c”用于显示倒计时,”-d”用于设定延迟的秒数。最后screen.png是保存截屏要有的文件名。
偶然发现OpenBSD 5.7上的SED编辑器不支持以’\t’来替代制表符。解决方式就是安装GSED,或者使用“ctrl+v”然后按TAB键的方式来输入制表符。 root@daisy ~ # echo test | sed ‘s/es/\t/’ ttt root@daisy ~ # echo test | gsed ‘s/es/\t/’ t t root@daisy ~ # echo test | sed ‘s/es/ /’ t t
我的smartos global zone直接接入互联网,整天被一些程序尝试自动登陆。我决定禁用密码登陆,只允许密钥验证登陆。这样,那些自动扫描程序在尝试连接系统SSH端口时就会被直接拒绝,不给他们猜密码的机会。