1

我正在使用插件 SDK 编写一个 Firefox 扩展,它需要启动一个 bash 脚本,然后从它在当前目录中创建的文件中读取其输出,如下所示:

echo "bash script output" >file.txt

我在 main.js 中按如下方式启动 bash 脚本:

function runBashScript(scriptFile) {
    var localFile = Cc["@mozilla.org/file/local;1"]
        .createInstance(Ci.nsILocalFile)
    localFile.initWithPath('/bin/bash');

    var process = Cc["@mozilla.org/process/util;1"]
        .createInstance(Ci.nsIProcess);
    process.init(localFile);

    var args = [ scriptFile ];
    var rc = process.runAsync(args, args.length, 
        function(subject, topic, data) {
            console.log('subject=' + subject + ', topic=' + topic + ', data=' + data);
            console.log('bash script finished executing, returned ' + process.exitValue);
    });

    return rc;
}

我的问题是我如何以编程方式从 main.js 中找出当脚本回显时 file.txt 将存储在哪里?那么启动进程的当前工作目录是什么?无论如何要检索或更改它吗?

nsIProcess online 上的文档没有提到任何关于此的内容。

我已经确定(通过搜索 FS)file.txt 在使用 cfx run 运行扩展时以及在将其安装为 XPI 后在 Firefox 中运行时结束的位置。但我想在启动时确定这些信息,甚至可能控制它最终存储的位置。

4

3 回答 3

2

这是一个限制nsIProcess- 它总是使用应用程序范围的当前目录执行应用程序。nsIDirectoryServiceProvider您可以使用接口获取此目录:

var currDir = Cc["@mozilla.org/file/directory_service;1"]
                .getService(Ci.nsIDirectoryServiceProvider)
                .getFile("CurWorkD", {}).path;

您的问题仍然是该目录通常不可写。虽然您可以通过 js-ctypes 更改此目录,但这绝对是不可取的 - 您可能会破坏其他依赖于当前目录未更改的代码。另一种方法是让 bash 在执行脚本之前更改当前目录:

var args = ["-c", "cd /tmp && . " + scriptFile.replace(/\W/g, "\\$&")];

请注意,该replace()部分对于转义所有异常字符很重要 - 否则文件名的部分可能会被解释为附加命令。

于 2012-08-15T10:10:30.507 回答
0

open 调用给出了文件的路径。如果您未能提供完整路径,它将默认为运行该命令的进程的当前工作目录。进程可以使用系统调用更改其当前工作目录,因此它在以后启动时所在的位置可能会不一样。如果您关心文件的位置,则应指定完整路径。

要将文件写入 Unix/Linux 上的临时目录,请执行以下操作:

echo "bash script output" >/tmp/file.txt

例如,您不应该将文件写入用户的主目录,因为它可能会覆盖同名的不同文件。

于 2012-08-14T16:41:08.867 回答
0

现在有subprocess,它允许您执行此操作。

于 2014-12-17T18:23:01.900 回答