문제

문자열을 입력으로 사용하여 Bash를 호출하고 싶습니다. 같은 것 :

sh -l -c "./foo"

Java에서 이것을하고 싶습니다. 불행히도, 내가 사용하는 명령을 호출하려고 할 때 getRuntime().exec, 다음 오류가 발생합니다.

      foo": -c: line 0: unexpected EOF while looking for matching `"'

      foo": -c: line 1: syntax error: unexpected end of file

내 문자열이 EOF로 종료되지 않은 것 같습니다.

플랫폼 특정 EOF를 Java 문자열에 삽입하는 방법이 있습니까? 아니면 "sh"를 호출하기 전에 임시 스크립트에 글을 쓰는 것과 같은 다른 접근법을 찾아야합니까?

도움이 되었습니까?

해결책

이것을 사용하십시오 :

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

메인 포인트 : 이중 인용문을 넣지 마십시오. 쉘에 명령 줄을 쓸 때만 사용됩니다!

예, echo "Hello, world!" (쉘에 입력 한대로) : 다음으로 번역됩니다.

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

(껍질이 일반적으로 내장 된 순간을 잊어 버립니다. echo, 그리고 전화하고 있습니다 /bin/echo 대신에. :-))

다른 팁

Windows 명령은 Unix, Mac OS X 및 GNU/Linux와 다르게 줄입니다.

Windows에서 프로세스는 실행 가능한 이름 (및 공간) 이후와 같이 입력 텍스트를 수신합니다. 그런 다음 명령 줄을 구문 분석하는 것은 프로그램에 달려 있습니다 (일반적으로 암시 적으로 수행되며 프로그래머는 종종 단서가 없습니다).

GNU/Linux에서 쉘은 명령 줄을 처리하고 C의 메인으로 전달 된 친숙한 문자열 배열을 gnereat습니다. 당신은 그 껍질이 없습니다. 최선의 접근 방식 (Windows에서도)은 각 명령 줄 인수를 자체 문자열로 개별적으로 전달하는 exec의 형태를 사용하는 것입니다.

당신이 정말로 원한다면 구문 분석에 쉘을 얻을 수 있습니다. 예를 들어 (비정상적인)과 같은 모습을 보일 것입니다.

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});

EOF는 캐릭터가 아니므로 EOF를 쓸 방법이 없습니다. 인용 된 문자열을 닫는 것을 잊었습니다.

이 오류의 원인은 Bash가 기대하는 구문 토큰이 누락 될 가능성이 높지만 Bash가 발생하기 전에 전달한 문자열이 끝납니다. FI가 닫히지 않거나 완료되지 않은 ifs, fors 등을 찾으십시오.

문자열 안에있을 때 따옴표를 피해야합니다. "쓰기 "를 쓰는 대신.

예를 들어

strcpy (c, "이것은" "quess " "quotes");

내가 당신이라면, 나는 문자열의 내용을 온도 바쉬 파일에 쓰고 Bash가 오류없이이를 실행하는지 확인할 것입니다. 그것이 오류없이 실행되면 더 이상 디버깅을 고려할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top