0

我正在使用 spidermonkey javascript 引擎从 shell 运行 javascripts,并且大多数事情都可以根据需要运行。

我希望能够从命令行将变量作为参数传递给 javascripts,但无法找到一种方法来做到这一点,或者即使它是可能的。

例如,如果我有一个 javascript 文件 (myJs.js) 可以从存储在文件 (data.dat) 中的某些数据中解析文本,我目前使用正常语法调用 javascript:

js -f  myJs.js

并且 javascript 本身具有从我要处理的任何文件中获取数据的命令,如下所示:

var fileData = read("data.dat");

这很好用,但是如果我想为不同的数据文件重用 javascript,每次我想为新数据运行它时,我都必须在 javascript 中编辑文件名。

我的问题是,有没有办法从命令行将文件名(或任何其他变量)传递给 javascript,并从 javascript 中将其作为参数检索,例如:

js -f  myJs.js -- "othertData.dat"

javascript 将能够访问值“otherData.dat”的位置:

var fileData = commandLine.argument[0];
// (I know commandLine is not an object and argument not a property, just illustrating what I want to do!);

可能根本不可能做到这一点。我可以通过让脚本读取另一个包含文件名列表的文件来通过 javascript 批处理文件,但直接从命令行传递文件名会容易得多。

我已经广泛搜索了这方面的信息,并且存在一些混淆,因为您可以将 spidermonkey 本身的参数传递给 javascripts,但我想以类似于将变量参数传递给 bash 脚本的方式将变量直接传递给脚本:

: myBashScript <myData1> <myData2>

其中变量参数被检索到编号参数数组中:

firstArgument=$1

如果无法做到这一点,那么对此效果的权威声明可能会很有用,因为我发现在网络上讨论的类似问题没有明确的答案(大多数讨论传递 spidermonkey 自己的参数而不是变量)。

谢谢

4

4 回答 4

2

据此:https ://developer.mozilla.org/en-US/docs/SpiderMonkey/Shell_global_objects它也可能是scriptArgs。

于 2014-02-21T23:44:25.043 回答
1

使用树顶 SpiderMonkey:

$ ./js --help
[snip]
Version: JavaScript-C24.0a1
[snip]
$ cat myscript.js 
print(uneval(arguments));
$ ./js -f myscript.js -- foo bar baz
["foo", "bar", "baz"]

我想这就是你想要的,是吗?

于 2013-06-19T02:12:29.533 回答
0

我终于放弃并使用了一种解决方法......我编写了一个简短的(可重用)shell脚本,充当终端和spidermonkey js之间的桥梁。从终端我调用带有参数列表的 shell 脚本,我想将这些参数提供给 javascript(第一个是要运行的 javascript 文件的名称)。所以代替(相当于):

js -f myscript - arg1 arg2 arg3

(我仍然无法实现)

我用

javascript myscript arg1 arg2 arg3

(javascript 是我的桥接脚本的名称)。就是这样,它工作正常。

桥接脚本只是读取参数,将它们写入格式化为 javascript 数组分配的临时文件,将 .js 脚本附加到临时文件并执行它。

# create jscode file a write js to declare an array to hold arguments
echo "var args = new Array();" > jscode

# write assignments to each array index to jscode file
# counter initialised to -1 to allow first argument (filename) to be skipped
i=-1
for TOKEN in $*
do
if [ if $i != -1 ]
  then
  echo "args[$i] = \"$TOKEN\";" >> jscode
fi
i=$((i+1))
done

# append script file (first arg is file name) to jscode file
cat $1 >> jscode
#run jscode using spidermonkey
jsc -f jscode

所以,如果我想从终端发送参数“hello”“world”到一个名为greeting.js的javascript,我使用:

javascript greeting.js hello world

现在创建的临时 jscode 文件开始:

var args = new Array();
arg[0] = "hello";
arg[1] = "world";
// contents of greeting.js appended here
于 2013-06-25T09:09:20.277 回答
0

https://developer.mozilla.org/en-US/docs/SpiderMonkey/Shell_global_objects指定顶层的“参数”应该将参数传递给 shell,忽略任何与 shell 相关的选项。

不过,我发现这在 Mozilla 24 分支的某些版本中被破坏了,并提交了一个错误。

于 2013-09-17T20:47:58.617 回答