【问题标题】:passing variables arguments to spidermonkey javascript from shell从shell将变量参数传递给spidermonkey javascript
【发布时间】:2013-06-07 10:09:23
【问题描述】:

我正在使用 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 本身的参数传递给 javascript,但我想以类似于将变量参数传递给 bash 脚本的方式将变量直接传递给脚本:

: myBashScript <myData1> <myData2>

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

firstArgument=$1

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

谢谢

【问题讨论】:

  • 请不要将其标记为 link 的副本,因为尽管我确信他想做同样的事情,但这个问题似乎与我在这里提到的 spidermonkey 参数混淆了并且没有令人满意的答案,所以我希望这个问题能够阐明需要什么并解决问题。谢谢。

标签: javascript shell command-line-arguments spidermonkey


【解决方案1】:

【讨论】:

    【解决方案2】:

    使用树顶 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"]
    

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

    【讨论】:

    • 如果这行得通那就太好了,可惜行不通。 Mac 的内置 jsc 支持参数传递跟随——但 spidermonkey 不能以这种方式工作
    • 谢谢。我刚刚注意到我的版本是 JavaScript-C 1.8.5 2011-03-31 所以这可能会有所不同,但是您的行会引发错误。如果我使用单分隔符,我现在可以读取传递的参数字符串(尽管 ["a", "b", "c"] unevals to : ["[a,b,c]"] 并且如果我尝试将它评估为一个数组,它只有一个成员。至少这是一些进步。我会继续试验。
    【解决方案3】:

    我终于放弃并使用了一种解决方法...我编写了一个简短的(可重复使用的)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
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-22
        • 2013-03-28
        • 1970-01-01
        • 2015-08-24
        相关资源
        最近更新 更多