跳到主要内容

Shell

JavaScript Shell提供了一种简单的方法,可以以批处理模式运行脚本,或者在交互式环境中进行探索式编程。

调用Shell

java org.mozilla.javascript.tools.shell.Main [options] script-filename-or-url [script-arguments]

其中options包括:

-e script-source

将_script-source_执行为JavaScript脚本。

-f script-filename-or-url

读取_script-filename-or-url_的内容并将其作为JavaScript脚本执行。

-opt optLevel / -O optLevel

优化到_optLevel_指定的级别,该级别必须为-1或介于09之间的整数。详情参见Rhino优化

-version versionNumber

指定编译时的语言版本。字符串_versionNumber_必须是100110120130140150160170之一。有关语言版本的更多信息,请参见JavaScript语言版本

-strict

启用严格模式。

-continuations

启用对continuations的实验性支持,并将优化级别设置为-1以强制为解释模式。从Rhino 1.7开始,此选项不再可用。

注意

如果在安装了安全管理器并将系统属性rhino.use_java_policy_security设置为true的情况下调用Shell,Shell将根据Java策略设置限制脚本的权限(基于脚本的URL),此功能仅在JVM实现了Java2安全模型时可用。

预定义属性

在Shell中执行的脚本可以访问顶级对象的一些额外属性。

arguments

arguments对象是一个数组,包含调用Shell时命令行中提供的所有参数的字符串。

environment

返回当前环境对象。

history

显示Shell命令的历史记录。

help()

执行help函数将打印使用帮助信息。

defineClass(className)

使用字符串参数_className_表示的Java类定义一个扩展。使用ScriptableObject.defineClass()来定义扩展。

deserialize(filename)

从指定文件中恢复以前通过调用serialize写入的对象。

gc()

运行垃圾回收。

load([filename, ...])

加载由字符串参数指定的JavaScript源文件。如果提供多个参数,则每个文件依次读取并执行。

loadClass(className)

加载并执行由字符串参数_className_表示的类。此类必须是实现Script接口的类,与任何通过Rhino JavaScript编译器编译的脚本一致。

print([expr ...])

计算表达式并打印结果。计算每个表达式,将结果转换为字符串并打印。

readFile(path [, characterCoding])

读取指定文件,并使用指定的字符编码或默认字符编码将其字节转换为字符串。

readUrl(url [, characterCoding])

打开到字符串url的输入连接,读取其所有字节并将其转换成字符串,使用指定的字符编码或默认字符编码。

runCommand(commandName, [arg, ...] [options])

执行指定命令,并带有给定的参数和选项作为独立进程运行,返回进程的退出状态。

用法:

runCommand(command)
runCommand(command, arg1, ..., argN)
runCommand(command, arg1, ..., argN, options)

传递给runCommand的最后一个参数是JavaScript对象,它是选项对象。否则,它将被转换为字符串并表示最后的参数,假定选项对象为空。

选项对象的以下属性被处理:

  • args - 提供额外命令参数的数组。
  • env - 显式环境对象。它的所有可枚举属性定义对应的环境变量名称。
  • input - 进程输入。如果不是java.io.InputStream,则将其转换为字符串并作为进程输入发送。如果未指定,则不向进程提供输入。
  • output - 进程输出替代java.lang.System.out。如果不是java.io.OutputStream实例,则读取进程输出,将其转换为字符串,与输出属性值(已转换为字符串)附加在一起,并作为新值赋予输出属性。
  • err - 进程错误输出替代java.lang.System.err。如果不是java.io.OutputStream实例,则读取进程错误输出,将其转换为字符串,与错误属性值(已转换为字符串)附加在一起,并作为新值赋予错误属性。

seal(object)

封闭指定对象,使得任何试图添加、删除或修改其属性的操作都会抛出异常。

serialize(object, filename)

将给定对象序列化到指定文件。

spawn(functionOrScript)

在不同线程中运行指定函数或脚本。

sync(function)

从现有功能创建同步功能(类似于Java中的同步方法)。新功能在其调用的this对象上同步。

quit()

退出Shell。如果在交互模式下在提示符处输入文件结束符字符,Shell也将退出。

version([number])

获取或设置JavaScript版本号。如果未提供参数,则返回当前版本号。如果提供参数,参数应为100110120130140150160170中的一个,以表示JavaScript 1.0、1.1、1.2、1.3、1.4、1.5、1.6或1.7版本。

示例

调用

下面是在命令行中调用Shell的三次示例(系统命令提示符显示为$)。第一次调用在命令行中直接执行脚本。第二次调用没有参数,因此Shell进入交互模式,逐行读取和评估输入。最后一次调用执行文件中的脚本并访问脚本本身的参数。

$ java org.mozilla.javascript.tools.shell.Main -e "print('hi')"
hi

$ java org.mozilla.javascript.tools.shell.Main
js> print('hi')
hi
js> 6*7
42
js> function f() {
return a;
}
js> var a = 34;
js> f()
34
js> quit()

$ cat echo.js
for (i in arguments) {
print(arguments[i])
}

$ java org.mozilla.javascript.tools.shell.Main echo.js foo bar
foo
bar

spawnsync

以下示例通过spawn创建两个线程,并使用sync创建了函数test的同步版本。

js> function test(x) {
print("进入");
java.lang.Thread.sleep(x*1000);
print("退出");
}
js> var o = { f : sync(test) };
js> spawn(function() {o.f(5);});
Thread[Thread-0,5,main]
进入
js> spawn(function() {o.f(5);});
Thread[Thread-1,5,main]
js>
退出
进入
退出

runCommand

下面是一些在Linux下调用runCommand的示例。

js> runCommand('date')
Thu Jan 23 16:49:36 CET 2003
0
// 使用input选项提供进程输入
js> runCommand("sort", {input: "c\na\nb"})
a
b
c
0
js> // 输出与err选项演示
js> var opt={input: "c\na\nb", output: '排序输出:\n'}
js> runCommand("sort", opt)
0
js> print(opt.output)
排序输出:
a
b
c
js> var opt={input: "c\na\nb", output: '排序输出:\n', err: ''}
js> runCommand("sort", "--bad-arg", opt)
2
js> print(opt.err)
/bin/sort: 无法识别的选项 `--bad-arg`
使用 `/bin/sort --help` 获取更多信息。

js> runCommand("bad_command", "--bad-arg", opt)
js: "<stdin>", line 18: 未捕获的JavaScript异常: java.io.IOException: bad_command: 未找到
js> // 向系统Shell传递显式环境
js> runCommand("sh", "-c", "echo $env1 $env2", { env: {env1: 100, env2: 200}})
100 200
0
js> // 使用args选项提供额外命令参数
js> var arg_array = [1, 2, 3, 4];
js> runCommand("echo", { args: arg_array})
1 2 3 4
0

Windows示例类似:

js> // 调用Shell命令
js> runCommand("cmd", "/C", "date /T")
27.08.2005
0
js> // 运行sort并收集输出
js> var opt={input: "c\na\nb", output: '排序输出:\n'}
js> runCommand("sort", opt)
0
js> print(opt.output)
排序输出:
a
b
c
js> // 启动记事本并等待其退出
js> runCommand("notepad")
0