May 2012 Archives

shell 中的 ` 和 $()

| 2 Comments | No TrackBacks

sh(1) 脚本中,` 和 $() 的作用类似。比如:

rm `find /foo/bar -ctime +3d -type f`【注1】

表示将 find 的输出结果作为rm的命令行输入。

常写 sh(1) 脚本的人可能会用另一个写法:

rm $(find /foo/bar -ctime +3d -type f)

这个写法和第一种是等价的。不过,$()的好处是可以嵌套。

个人比较倾向于使用 ` 而不是 $(),主要有三个原因:

  1. () 和 {} 在显示时差别很小,容易引起误会;
  2. 复杂到需要嵌套的命令通常是不对的;
  3. ` 可以在 sh 和 [t]csh 中使用,而 $() 只能在 sh 中使用。

【注1】FreeBSD系统中,此处实际可以用 find /foo/bar -ctime +3d -type f -delete 来代替。

常见的场景是由于某种原因 ls 无法使用(内存不足、动态连接库丢失等等)。

因为 shell 通常可以做 * 扩展,所以我们可以用:

echo *

来列出当前目录中的文件。

FreeBSD 开始用 10 以上的版本号有一段时间了。这个变动立刻导致了大量 ports 无法编译,多数情况下是因为开发者采用了较早版本的 libtool 导致的,具体来说,是类似下面的代码:

    case $host_os in
    freebsd[123]*) objformat=aout ;;
    *) objformat=elf ;;
    esac

解法是在星号前面加个小数点。

前段时间的半夜 make 总是在 OpenOffice 上通不过,结果发现是同样的原因。囧死了......当初匹配的时候打个.会死吗?

(这个问题已经在 libtool 2.4.2 以上版本中修正)。教训是,即使是代码生成器,重复的代码导致维护成本的增加。

Monthly Archives

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 5.2.3