2012-08-14 3 views
1

나는 Addon SDK를 사용하여 bash 스크립트를 시작한 후 현재 디렉토리에 다음과 같이 생성 한 파일에서 출력을 읽어야한다.nsIProcess를위한 작업 디렉토리를 얻거나 설정하는 방법 runAsync()

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 내에서, 프로그래밍 방식으로 알아 어떻게되는 경우 : 내 main.js에서 다음과 같이

echo "bash script output" >file.txt 

나는 bash는 스크립트를 실행하고 스크립트가 에코 할 때? 시작된 프로세스의 현재 작업 디렉토리는 무엇입니까? 그리고 어쨌든 그것을 검색하거나 변경하려면?

nsIProcess 온라인 설명서에는 이에 대한 언급이 없습니다.

cfx run을 사용하여 확장 프로그램을 실행할 때와 XPI로 설치 한 후 Firefox에서 실행할 때 file.txt가 끝나는 위치를 (FS를 검색하여) 결정했습니다. 하지만 시작시이 정보를 확인하고 저장 위치를 ​​제어하려고합니다.

답변

2

이 제한은 nsIProcess입니다. 이는 응용 프로그램 전체의 현재 디렉토리를 사용하는 응용 프로그램을 항상 실행합니다.

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

귀하의 경우 문제는이 디렉토리는 일반적으로 쓸 수 없음을 여전히 : 당신은 nsIDirectoryServiceProvider interface을 사용하여이 디렉토리를 얻을 수 있습니다. js-ctypes를 통해이 디렉토리를 변경할 수는 있지만, 현재 디렉토리에 의존하지 않는 다른 코드는 변경되지 않을 수도 있습니다. - 파일 이름의 다른 부분 추가 ​​명령으로 해석 얻을 수

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

주를 replace() 부분은 모든 이상한 문자를 이스케이프 것이 중요하다고 : 대안은 bash는 스크립트를 실행하기 전에 현재 디렉토리를 변경할 수 있도록하는 것입니다.

+0

블라디미르에게 감사드립니다! 이 질문에 대한 답변입니다. 필자의 경우, file.txt 파일은 항상 생성되고 성공적으로 작성되기 때문에 CurrWorkD 디렉토리는 쓰기 가능합니다. 나는 file.txt가 아닌 /tmp/file.txt에 내 스크립트를 반향하게 할 것이다. 보다 단순한 타협처럼 보입니다. :) –

0

열린 호출은 파일 경로를 제공합니다. 전체 경로 지정에 실패하면 명령을 실행하는 프로세스의 현재 작업 디렉토리가 기본값이됩니다. 프로세스는 시스템 호출을 사용하여 현재 작업 디렉토리를 변경할 수 있으므로 시작될 위치가 나중에 동일하지 않을 수 있습니다. 파일이 어디에 있는지 신경 쓰면 전체 경로를 지정해야합니다.

유닉스/리눅스의 임시 디렉토리에 파일을 작성하려면 수행

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

당신은, 예를 들어, 사용자의 홈 direetory가이 같은 다른 파일을 덮어 쓸 수 있습니다 할 수 있기 때문에 파일을 작성하지 말아야 이름.

+0

답장을 보내 주셔서 감사합니다. runBashScript에서 require ('self'). data.url ('script.sh')을 사용하여 스크립트의 매개 변수를 전달합니다.이 경로는 toFilename to require ('api-utils/url')를 사용하여 전체 경로로 변환합니다. 결과적으로 script.sh는 다음과 같이 호출됩니다. /tmp/tmpihluZS.mozrunner/extensions/[email protected]//resources/my-extension/data/client.sh (cfx 실행과 함께 실행) 및 /home/alin/devprofile/extensions/[email protected]//resources/my-extension/data/client.sh (파이어 폭스에서 XPI를 설치 한 후 실행) –

+0

하지만 첫 번째 경우에는 file.txt cfx를 실행중인 현재 디렉토리에 저장됩니다. 두 번째 경우 XPI를 설치 한 후 Firefox에서 실행하면 파일.txt는 ~/alin/file.txt에 저장됩니다. –

+0

프로세스의 작업 디렉토리가 실행 파일의 위치가 아닙니다. 둘은 관련이 없습니다. – stark

0

이제는 subprocess이 있습니다.이 작업을 수행 할 수 있습니다.

관련 문제