2009-08-21 5 views
0

런타임을 사용하여 시스템을 호출하고 있습니다.은 Java에서 시스템 호출에 대한 도움이 필요합니다.

"ls -l"로 호출하고 가져온 내용을 읽을 때 디렉터리 내용이 예상대로 정확하게 인쇄됩니다.

그러나 "which ffmpeg"또는 "ffmpeg -i FILENAME"으로 호출하면 ffmpeg을 찾을 수 없다는 메시지가 다시 나타납니다. ffmpeg를 명령 줄에서 정확하게 동일한 방법으로 사용할 경우에도 정상적으로 작동합니다. 마찬가지로 그것은 "which mysql"또는 "which perl"이 모두 존재하고 시스템에서 잘 작동하는 것을 거부합니다.

필자는 일종의 권한이라고 가정하고 있지만 주위를 피하는 방법은별로 없습니다.

의견이 있으십니까?

edit--

몇 가지 추가 정보

... 난 아마도 모든 환경 문제입니다, 이클립스에서 JUnit을로 이것을 실행 해하고 있습니다. 나는 이것을 구체적으로 Eclipse를 구성한 적이 없다 ... 아마 내가 필요로 할까? 명령 "echo $ PATH"를 전달하면 실제 경로가 아닌 "$ PATH"가 출력됩니다. 다시, 그게 무슨 뜻인지 모르겠다. 마지막으로, 저는 OSX를 사용하고 있습니다. 따라서 도움이된다면 리눅스 문제로 간주 할 수 있습니다.

+0

정확한 코드를 볼 수 있습니까? –

답변

3

당신은 환경 설정에 대한 당신의 생각에 못 박았습니다. JUnit 테스트를 마우스 오른쪽 버튼으로 클릭 한 다음 "Run As ..."로 이동 한 다음 "Run Configurations ..."옵션으로 이동하십시오. 팝업에서 "환경"이라는 탭이 표시됩니다. 이것은 JUnit 테스트가 "PATH"변수를 포함하여 환경을 조사 할 곳입니다.

테스트에서 "ffmpeg"를 찾으려면 명령 줄에서 "which ffmpeg"를 수행하고 결과를 가져와야합니다. Eclipse에서 Environment 탭의 "New ..."버튼을 클릭하고 변수 이름으로 PATH를 입력하고 "ffmpeg"를 값으로 포함하는 디렉토리를 입력하십시오. 그게 효과가 있다고 생각합니다.

참고 : 다음에 PATH의 값을 설정 그래서 '는/usr/빈 /는 FFmpeg를'반환 '하는는 FFmpeg'경우가 아닌 전체 경로

을 FFMPEG하기는 FFmpeg를 포함하는 디렉토리의 경로를 원하는 '/usr/bin '.

설정 한 환경을 유지하는 방식으로 Eclipse를 시작한 경우 액세스 할 수 있어야합니다. 이것은 Eclipse 시작 스크립트가 부팅 할 때 많은 환경을 지우는 경향이 있기 때문에 생각보다 힘들 수 있습니다. 나는 첫 번째 방법을 권하고 싶다. 제가 OSX에 X11에서 "FFmpeg에있는"실행

+0

예 ... 답을 게시하려면 여기로 돌아 왔지만 당신이 대답했기 때문에 정답을 줄 것입니다 ... 이클립스는 일반적으로 코드의 최종 목적지가 아니기 때문에 편집에 추가하십시오. 이를 실행하는 환경에도 경로가 올바르게 설정되어 있는지 확인하는 것이 중요합니다. 제 경우에는 셸에서 시작된 jboss에 있습니다. 그래서 환경 변수를 만들고 자바 코드에서 가져와야합니다. 그러면 모든 것이 예상대로 작동합니다. –

0

내 생각에 JVM 런타임은 다른 사람으로 실행 중이며 다른 경로를 사용하고있을 것입니다. "ls"는/bin에 있으며 "which"는 일반적으로/usr/bin에 있습니다. 이를 확인하려면 "/ usr/bin/which"를 실행 해보십시오. 자신의 OS에 대해 잘 모르겠지만 직접 시도하지는 않았지만 변수 LD_LIBRARY_PATH를 Unix에서 원하는 경로로 설정해야한다고 언급했다.

+1

'LD_LIBRARY_PATH'는 동적으로 링크 된 라이브러리를로드하는 데 사용되며, 프로그램을 실행하는 데 사용되지 않습니다 (동적으로 링크 된 라이브러리를 사용하지 않는 경우). 'ls' 나'which'와 같은 단순한 것들을 실행하는 데는 이것을 사용하지 않아야합니다. –

+0

예, 변수 PATH는 ffmpeg에 대한 경로가 포함되어 있는지 확인하기 위해보고 싶은 경로입니다. –

0

는 말한다 :

는/usr/빈/빈에서 더는 FFmpeg되지는/usr/sbin에/sbin에는/usr은 X11R6/bin에

입니다 /되는 $ PATH에요. 프로그램의 결과는 무엇입니까?

+0

제 생각에 ffmpeg는 make install 방법론을 통해 설치하지 않았습니다 ... 만약 당신이 그렇게했다면, 당신이'다른 것 '을 할 때처럼 경로를 출력 할 것입니다. –

+0

그게 요점은, 난 ffmpeg가 없어 "어느"그것이 나를 찾는 곳을 보여줍니다. 문제가 환경 설정이면, "which"의 출력은 $ PATH를 줄 것입니다. –

+0

나는 그런 작업을 한 번도 본 적이 없다 ... 어떤 글자를 입력 할 때 존재하지 않는 글자를 입력 할 때, 그냥 새로운 글자를 출력한다. –

0

당신은 쓰기 :

내가 명령을 전달 "$ PATH 에코"그냥 오히려 실제 경로보다 "$ PATH에"를 출력한다 ; 다시, 그게 무슨 뜻인지 모르겠다.

설명하기 쉽습니다. "$ PATH"확장은 일반적으로 명령 셸에서 수행합니다. 런타임은 명령 셸에서 명령을 실행하는 대신 직접 명령을 실행합니다. $ PATH를 확장하려면 쉘에서 명령을 명시 적으로 실행해야합니다. 예 :

exec (새 문자열 []/bin/sh ","-c ","echo $ PATH "});

덧붙여 말하자면, 같은 일이 fork()exec()을 사용하여 명령을 실행하는 C/C++ 프로그램에서 발생합니다. 그러나 system() 라이브러리 함수는 위와 같이 쉘에서 명령을 실행합니다.

0

PATH 설정에 관계없이 쉘로 빌드 된 명령과 바이너리를 구별해야합니다.

% which ls 
/bin/ls 

% which which 
which: shell built-in command 

그래서 일부 명령은 쉘에만 적용되며 다른 런타임에서 직접 사용할 수있는 실제 명령이 아닙니다.

관련 문제