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;
}

私の質問は、スクリプトがそれにエコーするときに file.txt が保存される main.js 内から、プログラムでどのように見つけるのですか? では、起動されたプロセスの現在の作業ディレクトリは何ですか? とにかくそれを取得または変更する方法はありますか?

オンラインのnsIProcessのドキュメントでは、これについて何も言及されていません。

cfx run を使用して拡張機能を実行した場合、および XPI としてインストールした後に Firefox で実行した場合に、file.txt が終了する場所を (FS を検索して) 確認しました。しかし、起動時にこの情報を特定し、最終的にどこに保存されるかを制御したいと考えています。

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

これを可能にするsubprocessが追加されました。

于 2014-12-17T18:23:01.900 に答える
0

open 呼び出しは、ファイルへのパスを提供します。フル パスを指定しないと、コマンドを実行しているプロセスの現在の作業ディレクトリがデフォルトになります。プロセスは、システム コールを使用して現在の作業ディレクトリを変更できるため、プロセスが開始されたときの場所は、後で同じではない可能性があります。ファイルの場所が気になる場合は、フル パスを指定する必要があります。

Unix/Linux の一時ディレクトリにファイルを書き込むには、次のようにします。

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

同じ名前の別のファイルを上書きする可能性があるため、たとえば、ユーザーのホームディレクトリにファイルを書き込むべきではありません。

于 2012-08-14T16:41:08.867 に答える