Bash One-Liners Explained 译文(三)

最近工作,生活中有一堆事情要处理,博客好久没更新了,请见谅。

拖了好久才翻译好这篇文章,这篇翻译下来好累,主要是原文废话太多了,后来还是决定尽量省略部分内容,建议有时间的还是去看下原文。这一篇太长了,先翻译部分,我会继续不断的更新。

这是 Bash One-Liners Explained 系列的第三篇文章。在这一篇里,我会给大家介绍重定向相关的内容。我会选择用最合适的 Bash 方法,各种常见的语法和技巧,向各位阐明如何用 Bash 内置的命令和 Bash 编程语言来完成各式各样的任务。

重定向其实是通过操作文件描述符来完成的,这样会更容易理解。当 Bash 启动时,会自动创建三个标准的文件描述符,它们分别是 stdin(标准输入,文件描述符为0),stdout(标准输出,文件描述符为1)和 stderr(标准错误输出,文件描述符为2)。你也可以创建更多的文件描述符,例如3,4,5等等,或者关闭它们,又或者拷贝它们。你可以从对应的文件中读取或者写入内容。

文件描述符指向某个文件(除非它们被关闭)。通常情况下,Bash 启动的三个文件描述符 —— stdin,stdout 和 stderr 都是指向你的终端,从终端输入中读取内容,并且把标准输出和标准错误都送到终端上。

查看全文

我的 VIM 配置

昨天给博客新建了一个我的装备分类,主要是想在这个类目下,分享一些我自己在用并且觉得值得推荐的软件(APP)或者硬件外设等等。相比之下,最值得推荐的应该是 Vim,一个古老而又强大的编辑器软件。

我从大二开始接触 Linux 就开始使用 Vim,至今也差不多有六、七年了。不过只有在最开始的一段时间,疯狂地在网上找自定义配置、找插件,之后就几乎没折腾过了。我的入门教程是大家來學 Vim 一個歷久彌新的編輯器A Byte of Vim。啃了这两份手册之后,基本上也就没继续再深入了解了。掌握了一些日常使用的技巧与方法,足以应付大量的编程任务了。我在入手 Macbook Air 之后,曾经尝试过 Sublime Text,也是一个很值得推荐的编辑器,无奈实在是精力有限,没去折腾,长草后就卸载了。我现在在 Mac 下面一直使用 MacVim

我目前的 Vim 工作环境截图:

my-vim

查看全文

KeyRemap4MacBook: Mac 上的改键神器

Apple Keyboard 是和 Magic Mouse 同时买的,我挑的是一件老款有线鼠标 MAC G6。但是到手后才发现是英版键盘,英版同标准版有几个键位的位置不一样,比如~键的位置是§,而前者跑到了Z键的边上,这就导致我经常按错键。无奈只能上网找一个可以改键的 APP,通过 Google 搜索到小众软件的一篇文章推荐 KeyRemap4MacBook 应用,试用一把,果然不错,神器一枚。

KeyRemap4MacBook 是日本人 Takayama Fumihiko 开发的免费改键(键盘映射)应用,功能非常强大。它内置了很多种常见的键盘映射方案,并且提供 Vim 模式,可以像 Vim 一样的操作浏览器(Firefox 不可以)、邮件等常规程序。映射方案可以限定在一种或者多种应用之内,或者排除某些应用,你也可以通过 Private.xml 文件扩展自己的自定义映射方案。

KeyRemap4MacBook 安装之后需要重启,在通知栏上会出现一个方块形状的图标,点击后可以在菜单中打开设置界面,见下图:

default-keyremap-settings

查看全文

Bash One-Liners Explained 译文(二)

这是 Bash One-Liners Explained 系列的第二篇文章。在这一篇里,我会给你们介绍如何用 Bash 来完成各种各样的字符串操作。我会选择用最合适的 Bash 方法,各种常见的语法和技巧,向各位阐明如何用 Bash 内置的命令和 Bash 编程语言来完成各式各样的任务。

1. 生成从 a 到 z 的字母表

$ echo {a..z}

这一行命令用到了括号展开(Brace expansion)功能,它可以用于生成任意的字符串。{x..y} 是一个序列表达式,其中 x 和 y 都是单个字符,这个表达式展开后包含 x 与 y 之间的所有字符。

运行上面的命令会生成从 a 到 z 的所有字母:

$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

2. 生成从 a 到 z 的字母表,字母之间不包含空格

$ printf "%c" {a..z}

这是一个 99.99% 的人都不知道的非常棒的技巧。如果你在printf命令之后指定一个列表,最终它会循环依次打印每个元素,直到完成为止。

在这一行命令中,printf 的格式为"%c",代表一个字符(character),后面的参数是从 a 到 z 的字符列表,字符之间以空格分隔。所以,当printf执行时,它依次输出每个字符直到所有字符全被处理完成为止。

下面是执行的结果:

abcdefghijklmnopqrstuvwxyz

输出的结果最后不包含换行符,因为printf的输出格式是"%c",其中并没有包含\n。如果你想输出完整的一行,可以简单地在字符列表后面增加一个$'\n'

$ printf "%c" {a..z} $'\n'

查看全文

Bash One-Liners Explained 译文(一)

Bash One-Liners Explained 是一系列介绍 Bash 命令技巧的文章,由国外牛人 Peteris Krumins 撰写。凭借扎实的功底和丰富的经验,作者总结了许多快速解决问题的技巧,并且每一条都只要用简洁的一行 Bash 命令就可以完成,同时每一行命令文中都给出了非常详尽的解释。

Peteris Krumins 是一位高产的博主,在他的博客上有很多非常精彩的文章,推荐大家有机会都可以去好好读一读。例如,大家耳熟能详的 Awk One-Liners ExplainedSed One-Liners Explained 等等。后者我也北曾经在博客上分享过一篇笔记

回到正题,虽然这一系列文章不难,但是还是可以从中学到很多细节的知识,相信这些肯定会对许多初学者有所帮助,所以我打算将这一系列翻译成中文,分享给大家。为了同原文保持一致,这一系列文章最终会分成以下五篇:

  1. Bash One-Liners Explained 译文(一): 文件处理
  2. Bash One-Liners Explained 译文(二): 操作字符串
  3. Bash One-Liners Explained 译文(三): 漫谈重定向
  4. Bash One-Liners Explained 译文(四): 历史命令
  5. Bash One-Liners Explained 译文(五): 命令行跳转

本系列的文章同其它系列一样,最终都可以在连载页面找到,有兴趣的同学可以随意翻翻,看看有没有一些对你有价值的文章,大家一起交流学习。

1. 清空文件内容

$ > file

这一行命令用到了输出重定向操作符>。输出重定向发生时,文件会被打开准备写入。如果此时文件不存在则先创建,存在则将其大小截取为0。这里我们并没有重定向写任何内容到文件中,所以文件依然保持为空。

如果你想替换文件的内容,或者创建一个包含指定内容的文件,可以运行下面的命令:

$ echo "some string" > file

2. 追加内容到文件

$ echo "foo bar baz" >> file

查看全文

WordPress 阻挡垃圾评论

我的博客人气一般,但是垃圾评论却特别之多,严重影响我的心情。自从开博客以来,我一直都是通过 Akismet 插件来发现和过滤垃圾评论,效果非常不错,很少有漏网之鱼。但是前两天在阅读了云淡然同学写的文章wp_create_nonce实现wordpress垃圾评论终极防御之后,我突然萌生出自己写一些阻挡垃圾评论策略的想法。

wordpress-spam

下面我介绍几条本博客现在正在使用的阻挡垃圾评论的策略,几天下来效果还可以接受。每一种策略都不是完美的,所以只能多种方式配合使用。当然,道高一尺,魔高一丈,很多策略都必须要不断地改进与完善,并且最好根据自己的情况适当地调整。当然,如果你不想折腾,还是老老实实地使用 Akismet 插件来防护吧,插件的功能更加完善可靠,本文的方法只适合于不想启用过多插件和喜欢折腾的同学。

.htaccess 文件

首先我们可以借助 .htaccess 文件来阻挡部分恶意的垃圾评论,这一类评论往往是通过脚本或者工具自动提交的。请将以下内容添加到网站根目录的 .htaccess 文件中:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php$
RewriteCond %{HTTP_REFERER} !.*kodango.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) http://%{REMOTE_ADDR}/$ [R=301,L]

上面的几条规则,可以阻挡来源不是你博客,或者 user agent 信息为空的机器人评论。

查看全文

rsync 同步文件重复拷贝问题

newrsynclogo

rsync 是同步文件的利器,一般用于多个机器之间的文件同步与备份,同时也支持在本地的不同目录之间互相同步文件。在这种场景下,rsync 远比 cp 命令更加合适,它只会同步需要更新的文件,默认情况下,rsync 通过比较文件的最后修改时间(mtime)和文件的大小(size)来确认哪些文件需要被同步过去。

最近刚好有一个需求,需要将文件从一个目录同步到另外一个目录去,我就首先试了下下面的命令:

# mkdir src dest
# echo hello > src/one.txt
# rsync --stats src/1.txt dest

这里加上 --stats 的目的是为了显示文件传输的详细信息。执行完成后文件已经同步到目标目录,非常简单,但是如果再执行一次,我们会非常尴尬地发现文件被再次同步过去:

# rsync --stats src/one.txt dest

Number of files: 1
Number of files transferred: 1
Total file size: 6 bytes
Total transferred file size: 6 bytes
Literal data: 6 bytes
Matched data: 0 bytes
File list size: 21
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 77
Total bytes received: 31

sent 77 bytes  received 31 bytes  216.00 bytes/sec
total size is 6  speedup is 0.06

查看全文

初试 Magic Mouse

期待已久的 Magic Mouse 终于到手了,之前一直在纠结到底选择 Magic Mouse 还是 Magic Trackpad,最终还是选择入手 Magic Mouse,从淘宝上选择了一家散装配件卖家, 咬牙丢进购物车马上下单,然后就开始漫长地等待过程。

本来按照预计,快递应该差不多 1-2 天就应该到的,结果申通非常地不给力,竟然耽搁了4、5天,走到今天(10-15)才到:

sto-express

而且中间很多次联系申通的客服,每次答复都是"我会帮你联系下对方, 稍后再回复你",然后就没有然后了,可惜没评分,要不然果断差评。余杭的申通分公司更加离谱,留下的座机号码压根打不通,一直占线。以后淘宝购物,如果有可能一定要避免使用申通(当然,我一直认为国内的快递没几家是好的)。

查看全文