2013-03-19 2 views
2

스칼라에서 두 개의 SBT 명령을 인수로 전달하여 프로세스 (그 문제에 대해서는 SBT)를 생성하려고합니다. 그러나bash 대 scala.sys.process.Process with Command Line Arguments

~/sbt.sh "project Foo" "run" 

: 나는 (작업 디렉토리 인 /home/bob/workingdir)를 우분투에서 떠들썩한 파티 프롬프트에서 스크립트를 호출 할 때

java -jar /home/bob/sbt/sbt/bin/sbt-launch.jar "[email protected]" 

하면 잘 작동 : 나는 sbt.sh 쉘 스크립트 (Manual Installation in sbt Documentation의 단순화 된 버전)을 만들어 , 다음 코드 조각을 사용하여 스칼라 프로그램에서 호출하고 싶습니다.

val pseq = Seq("/home/bob/sbt.sh", "\"project Foo\"", "\"run\"") 
val pb = scala.sys.process.Process(pseq, new java.io.File("/home/bob/workingdir")) 
pb.! 

SBT가 정상적으로 시작되고로드되면 다음과 같은 오류 출력으로 실패합니다 :

[error] Expected key 
[error] "project Foo" 
[error]^

그것은 Windows 8에서는 정상적으로 작동하지만 우분투 12.10에서는 실패합니다. 내 pseq은 전체 bash 명령을 사용하여 보통 String이었습니다. 나는 인수를 명시 적으로 (따옴표 안에 어떤 공간이든) 할당하기 위해서 Seq으로 바뀌었다.

아무도 두 가지 호출의 차이점을 지적하거나 다른 점은 무엇이 잘못 되었습니까?

답변

4

나는 해결책을 발견했다. 사소한 것으로 나타 났지만 어쨌든 공유 할 가치가 있습니다.

// no \"-quoting of passed SBT commands here! 
val pseq = Seq("/home/bob/sbt.sh", "project Foo", "run") 
val pb = scala.sys.process.Process(pseq, new java.io.File("/home/bob/workingdir")) 
pb.! 

깔끔하고 Windows와 Linux에서 모두 작동합니다. 명령 문자열로 /home/bob/sbt.sh "project Foo" "run"을 사용하면 Windows에서는 다소 편하지 만 Linux에서는 작동하지 않습니다.