Firefox addon 如何获取/设置nsIProcess runAsync()的工作目录

Firefox addon 如何获取/设置nsIProcess runAsync()的工作目录,firefox-addon,firefox-addon-sdk,Firefox Addon,Firefox Addon Sdk,我正在使用插件SDK编写Firefox扩展,该插件需要启动bash脚本,然后从当前目录中创建的文件中读取其输出,如下所示: echo "bash script output" >file.txt 我正在main.js中启动bash脚本,如下所示: 函数runBashScript(脚本文件){ var localFile=Cc[“@mozilla.org/file/local;1”] .createInstance(Ci.nsILocalFile) localFile.initWithPa

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

echo "bash script output" >file.txt
我正在main.js中启动bash脚本,如下所示:

函数runBashScript(脚本文件){
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,
功能(主题、主题、数据){
log('subject='+subject+',topic='+topic+',data='+data);
log('bash脚本完成执行,返回'+process.exitValue');
});
返回rc;
}
我的问题是,如何通过编程从main.js中找出脚本回显时file.txt将存储在哪里?那么,已启动流程的当前工作目录是什么?有没有办法检索或更改它

网上的文档没有提到这方面的任何内容


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

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

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

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

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

这是nsIProcess的一个限制-它将始终使用应用程序范围的当前目录执行应用程序。您可以使用以下方法获取此目录:

var currDir=Cc[“@mozilla.org/file/directory\u service;1”]
.getService(Ci.nsDirectoryServiceProvider)
.getFile(“CurWorkD”,{}).path;
您的问题仍然是该目录通常不可写。虽然您可以通过js ctypes更改此目录,但这绝对是不可取的-您可能会破坏依赖于当前目录的其他代码,这些代码不会更改。另一种方法是让bash在执行脚本之前更改当前目录:

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

请注意,
replace()
部分对于转义所有不寻常的字符非常重要,否则文件名的某些部分可能会被解释为一个附加命令。

现在有了,这允许您执行此操作。

感谢您的回复。在runBashScript中,我使用require('self').data.url('script.sh')传递脚本的参数,并使用require('api-utils/url')中的toFilename将其转换为完整路径。最终结果是script.sh作为:/tmp/tmpihluZS.mozrunner/extensions/my-extension被调用-id@jetpack//resources/my extension/data/client.sh(使用cfx run运行时)和as/home/alin/devprofile/extensions/my extension-id@jetpack//resources/my extension/data/client.sh(在firefox中安装XPI后运行时),但是,在第一种情况下,file.txt存储在运行cfx run的当前目录中。在第二种情况下,在安装XPI后从firefox运行时,file.txt存储在~/alin/file.txt中。进程的工作目录不是可执行文件的位置。这两者没有关系。是的,我知道区别。我告诉过您在两个不同的场景中是如何使用/bin/bash调用它们的,因此您可以看到file.txt出现在不同的位置(一次在~/alin中,另一次在我运行“cfx run”的目录中)。这似乎表明启动的进程的工作目录依赖于一些其他变量。您是正确的,这是因为我们在cfx运行中设置的环境明显不同。如果您想避免这种差异,请考虑使用WLADIMIAR PALANT的“扩展自动安装程序”扩展——您可以使用它快速测试扩展,同时避免这些差异:谢谢Wladimir!这回答了我的问题。在我的例子中,CurrWorkD目录似乎是可写的,因为file.txt文件总是被创建并成功写入。我只需要将脚本回显到/tmp/file.txt,而不是file.txt。似乎是一个更简单的妥协:)