2014-04-05 1 views
4

스칼라가 시스템 명령을 실행하고 출력을받을 수 있다는 것은 자명하다. 나는 시스템 커맨드를위한 웹 클라이언트를 작성하고있다. 그래서 나는 커맨드를 수행 할 필요가 있다고 말했고, 출력을 받으면 커맨드를 줄 수있다. 나는 사용자가 명령을 죽일 때까지이 작업을 계속하고 싶다. ProcessIO에 대해 읽었으며 스칼라에서 명령을 받고 출력을받는 명령을 얻었지만 어떻게 입력 할 수 있습니까?외부 명령에 대한 입력을 어떻게 제공합니까?

편집 : 내가 찾고있는 것은 scala 명령을 호출하는 것입니다. 내가 호출하는 명령은 입력을 요청하고, 사용자는 스칼라 프로그램에 입력을 제공 한 다음 호출 된 프로그램으로 전달합니다.

예제 :

스칼라 프로그램 -> 시스템 프로그램을 호출 -> 스칼라 프로그램 -> 스칼라 프로그램 프로그램이 다음 사용자와 사용자가 제공 입력에서 사용자 이름과 암호를 묻습니다 -> 시스템 프로그램은 사용자 이름과 암호를 요청 입력을 시스템 프로그램에 전달합니다.

입력을 먹이는 동안 프로세스를 유지하고 싶습니다.

+0

수행하려는 작업에 대해 자세히 설명해 주시겠습니까? –

+1

나는 당신이 필요로하는 것이 여기 있다고 생각합니다 : http://stackoverflow.com/questions/7195051/scala-getting-a-callback-when-an-external-process-exits –

+0

이 질문에 대한 답변을 업데이트하십시오. 많은 감사. – elm

답변

1

사용자가 콘솔에 stdin 이외의 값으로 입력을 제공하려는 경우 사용자의 질문에서 알 수 없습니다. 스칼라 프로그램에서이 기능을 "완전히 포함"하고 싶다고 생각하지만, 아직 그 기능을 수행하지 못했습니다. 그러나 콘솔을 사용할 수있는 경우 사용자 이름/비밀번호를 요청하는 간단한 스칼라 프로그램 예제와 스칼라 프로그램을 시작하는 또 다른 스칼라 프로그램의 예가 있으며 Process.run(true)은 호출 된 프로그램의 out/err을 입력 할 수있는 동안 콘솔에 연결합니다 콘솔에 제공됩니다. 복용 입력 테스트 할

SimpleProgram :의 Process이 경우

package so 

import scala.sys.process._ 

object ProcessBuilderTest extends App { 

    val classpath = "<path to>/scala-library.jar:./classes" 
    val pb = Process("java", Seq("-cp", classpath, "so.SimpleProgram")) 
    pb.run(true) // all the magic happens here. 
} 

:

package so 

import java.util.Scanner 

object SimpleProgram extends App { 

    def getInput(prompt: String): Option[String] = { 
    print(s"$prompt: ") 
    val sc = new Scanner(System.in) 
    sc.hasNextLine match { 
     case true => val out = sc.nextLine 
     if(out.length > 1) Some(out) else None 
     case _ => None 
    } 
    } 

    while(true) { 
    (getInput("username"), getInput("password")) match { 
     case (Some(u), Some(p)) => println(s"Logged in as $u"); System.exit(0) 
     case _ => println("Invalid input. Please try again.") 
    } 
    } 
} 

그리고 여기가 (클래스 경로 변경하여 w/o 작동하지 않습니다) ProcessBuilder를 호출 프로그램의 기본적으로 호출 된 프로그램을 ProcessBuilder에 래핑하는 것입니다. 나는 ProcessIO을 사용하여 적절한 문자를 먹을 수있는 방법을 제공하지 못하고 여전히 스트림 등을 죽일 수 없었다. 내 생각에 작동하는 run(true) 사례를 보면 유익 할 것입니다.

username: foo 
password: 
Invalid input. Please try again. 
username: foo 
password: bar 
Logged in as foo 

내가이 없기 때문에 스칼라 코드를 실행하는 "자바"를 사용하고 스칼라 내 맥에 설치 : 여기

는 수정 클래스 경로와 후자를 실행 한 콘솔 로깅의 예 Eclipse를 통하지 않고. Eclipse에서 ProcessBuilderTest은 두 클래스가있는 프로젝트 디렉토리에서 실행되었고 출력 디렉토리는 "bin"대신 "classes"로 설정되었습니다.

4

는 리디렉션 1을 제공

import scala.sys.process._ 
import java.io.File 

"""echo -e hello\nworld""" #> new File("hello") ! 

new File ("hello") #> """grep world -c""" !! 

을 다음과 같은 예를 생각해 보자.

이것은 출력 파일에 에코 된 문자열을 씁니다. 다음은 현재 입력 파일이 시스템 명령으로 리디렉션됩니다.

업데이트

"""echo -e hello\nworld""" #> """grep world -c""" !! 

가 리디렉션을 사용하여 문자열로 결과를 제공

명령. 이렇게하면 중간 파일을 피할 수 있습니다.

+0

그래서이 솔루션을 사용하면 scala 프로그램에서 사용자 입력을 파일에 기록하게됩니다. 파일을 열어 시스템 프로그램에 공급하려면 중간 사람 프로세스가 필요합니다. –

+0

이 프로세스가 종료됩니까? –

관련 문제