본문 바로가기

00. Functional Programming/Scala

Scala에서 시스템 커멘드를 사용하기

Scala에서는 Bash Shell을 부를 수 있는 방법이 있습니다. 이로 인하여, 쉽게 다른 프로그램을 구동 시키거나, 결과 값을 불러 올 수 있습니다.

예제는 Scala REPL을 사용 해 봅시다.

먼저, Bash Shell을 사용할 수 있는 scala의 sys.process._를 Import 해 봅시다.

scala> import sys.process._

import sys.process._


명령어 실행

만약 명령어를 실행 하고 싶다면 

scala> "{명령어}" !

를 사용하면 됩니다. 그러나, 리턴값은 나오지 않습니다.


scala> "ls -al" !

warning: there was one feature warning; re-run with -feature for details

합계 7156

drwxr-xr-x 50 ktz  ktz     4096  8월 16 10:25 .

drwxr-xr-x  3 root root    4096  4월 19 13:31 ..

-rw-------  1 ktz  ktz    13760  8월 16 10:25 .ICEauthority

drwxrwxr-x  4 ktz  ktz     4096  4월 19 15:38 .IdeaIC2016.1

drwxrwxr-x  4 ktz  ktz     4096  7월 16 12:33 .IdeaIC2016.2

drwxrwxr-x  4 ktz  ktz     4096  4월 28 15:06 .TelegramDesktop

-rw-------  1 ktz  ktz       62  8월 16 10:25 .Xauthority

... (너무 많아서 줄입니다.)

res0: Int = 0


리턴값을 받는 명령어 실행

만약 리턴 값을 받고 싶다면, 

scala> "{명령어}" !!

를 사용 합니다.


scala> val result = "ls -al" !!

warning: there was one feature warning; re-run with -feature for details

result: String =

"합계 7156

drwxr-xr-x 50 ktz  ktz     4096  8월 16 10:25 .

drwxr-xr-x  3 root root    4096  4월 19 13:31 ..

-rw-------  1 ktz  ktz    13760  8월 16 10:25 .ICEauthority

drwxrwxr-x  4 ktz  ktz     4096  4월 19 15:38 .IdeaIC2016.1

drwxrwxr-x  4 ktz  ktz     4096  7월 16 12:33 .IdeaIC2016.2

drwxrwxr-x  4 ktz  ktz     4096  4월 28 15:06 .TelegramDesktop

-rw-------  1 ktz  ktz       62  8월 16 10:25 .Xauthority

drwx------  3 ktz  ktz     4096  4월 19 14:48 .adobe

drwxrwxr-x  3 ktz  ktz     4096  5월 20 14:07 .android

drwxrwxr-x  2 ktz  ktz     4096  7월 13 13:42 .aws

-rw-------  1 ktz  ktz   102750  8월 16 20:22 .bash_history

-rw-r--r--  1 ktz  ktz      220  4월 19 13:31 .bash_logout

-rw-r--r--  1 ktz  ktz     3939  5월 29 16:25 .bashrc

drwxrwxr-x  3 ktz  ktz     4096  7월 14 19:08 .byobu

dr...


scala> println(result)

합계 7156

drwxr-xr-x 50 ktz  ktz     4096  8월 16 10:25 .

drwxr-xr-x  3 root root    4096  4월 19 13:31 ..

-rw-------  1 ktz  ktz    13760  8월 16 10:25 .ICEauthority

drwxrwxr-x  4 ktz  ktz     4096  4월 19 15:38 .IdeaIC2016.1

drwxrwxr-x  4 ktz  ktz     4096  7월 16 12:33 .IdeaIC2016.2

drwxrwxr-x  4 ktz  ktz     4096  4월 28 15:06 .TelegramDesktop

-rw-------  1 ktz  ktz       62  8월 16 10:25 .Xauthority

drwx------  3 ktz  ktz     4096  4월 19 14:48 .adobe

drwxrwxr-x  3 ktz  ktz     4096  5월 20 14:07 .android

drwxrwxr-x  2 ktz  ktz     4096  7월 13 13:42 .aws

-rw-------  1 ktz  ktz   102750  8월 16 20:22 .bash_history

... (너무 많아서 줄입니다.)


이렇게 다음과 같이 result 변수에 리턴 값을 받아 넣을 수 있습니다.


Pipeline을 사용하기

Bash Shell에서는 다음과 같이 사용할 수 있습니다.


$ ls -al | grep Desktop

drwxrwxr-x  4 ktz  ktz     4096  4월 28 15:06 .TelegramDesktop

drwxr-xr-x  2 ktz  ktz     4096  5월 23 10:15 Desktop


Scala에서도 다음과 같이 사용할 수 있습니다.


scala> val result = "ls -al" #| "grep Desktop" !!

warning: there was one feature warning; re-run with -feature for details

result: String =

"drwxrwxr-x  4 ktz  ktz     4096  4월 28 15:06 .TelegramDesktop

drwxr-xr-x  2 ktz  ktz     4096  5월 23 10:15 Desktop

"


다만 Scala에서는 | 가 이미 예약어로 등록이 되어 있으므로, "#|" 를 사용합니다.