本文为翻译
原文标题:jsc: My New Best Friend
原文作者:Craig Hockenberry
最近,我的朋友告诉了我一个很棒的隐藏命令行工具。在 Safari 和 一些其他 Apple 产品 使用的 JavaScript 架构中,有一个叫做 jsc 的工具。这是一个 JavaScript 的 CLI(命令行界面),使用与系统其他部分相同的代码。
你可以在 /System/Library/Frameworks/JavaScriptCore.framework/Versions/Current/Helpers/jsc 找到其二进制文件。这个路径太长了,不够好用,所以我设置了一个 命令别名 来降低使用成本,现在敲出 jsc 就可以使用。
那么,jsc 到底可以做什么呢?几乎所有在浏览器中使用 JavaScript 能够完成的,使用 jsc 都能做到,但要注意,在 jsc 中没有提供 document 和 window 实例。
如果你运行 jsc -h ,你会看到很多用于测试和分析 JavaScript 代码的选项。很明显, WebKit 的团队内部会使用 jsc 来运行测试。但是我们也可以使用它来 尝试一些想法,运行一些简单的小工具。
一个例子胜过千言万语(A picture is worth a thousand words),所以来让我向你展示一下如何运用 jsc 来解决一些简单的问题。我们的网站 Frenzic 最近需要处理一些土耳其语本地化的工作,就是将一些字符串转换为大写:将小写的 “i” 转换为没有点的版本。
JavaScript 中的 toLocaleUpperCase() 函数是解决我上文问题的一个很棒的方法,所以我选择加入 jsc 作为工具 来完成工作。而我遇到的第一个挑战就是获取输入。
幸运的是,有一个 readline() 函数可以从键盘输入获取输入并返回一个值。但不幸的是,输入不是以期望的形式进行的编码:字符会以 ISO-8859-1(Latin-1) 标准返回,而不是 UTF-8。对了,请记住,jsc 中没有 document 实例,所以会使用默认的编码。
为了突破这个限制,我们可以将部分字符编码到 UTF-16 然后再将它们解码回 UTF-8,就像下面这样:
var text = decodeURIComponent(escape(readline()));
(如果 WebKit 的工程师读到这篇文章,我想提个建议,最好能提供类似 --encoding=utf-8 这样的 命令行选项。)
jsc 生成输出的方式也是些许有别于浏览器的。必须使用 print() 来代替 console.log() 。我使用以下代码来转换文本输入并展示出来:
print(text.toLocaleUpperCase('tr-TR'));
还有很多非常有用的 内置函数 ,但到目前为止,我只需要读写文本的能力。虽说没有正式文档化,但 jsc 不仅支持读取 标准输入 还支持 作为 shebang 使用。
$ echo "print(1+2);" | jsc
3
由于上文我提到的文本转换逻辑我经常使用,所以我创建了一个 Turkish.js 文件:
while (true) {
print('Turkish text?');
var text = decodeURIComponent(escape(readline()));
print(text.toLocaleUpperCase('tr-TR'));
print('-------------');
}
这样一来,我就可以随时调用 jsc Turkish.js 了。怎么样,在命令行中使用 JavaScript 有够方便吧。你也来试试吧!
译者注:可以在 Shell 中使用下面的命令设置命令别名
alias jsc='/System/Library/Frameworks/JavaScriptCore.framework/Versions/Current/Helpers/jsc'