Linux에서 Scala 스크립트를 독립형으로 만드는 방법은 무엇입니까?

Linux에서 Scala 스크립트를 독립형으로 만드는 방법은 무엇입니까?

스칼라 프로그래밍말한다:

스칼라로 스크립트를 호출하는 것은 이러한 스크립트를 자주 사용하는 경우 지루합니다. Windows 및 Unix 계열 시스템에서는 scala 스크립트 파일 이름 호출을 사용할 필요가 없는 독립 실행형 Scala 스크립트를 생성할 수 있습니다. Unix 계열 시스템의 경우 다음 예에서는 실행 가능한 스크립트를 만드는 방법을 보여줍니다. chmod +x secho와 같이 권한을 실행 가능하게 만들어야 한다는 점을 기억하십시오.

#!/bin/sh
# src/main/scala/progscala2/toolslibs/secho
exec scala "$0" "$@"
!#
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

사용 방법은 다음과 같습니다.

$ secho Hello World
You entered: Hello World

무슨 뜻인지 궁금했는데

# src/main/scala/progscala2/toolslibs/secho
exec scala "$0" "$@"
!#

안에 sh?

Scala 스크립트를 독립형으로 만들 수 있습니까?

#!/path/to/scala
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

리눅스에서?

감사해요!

답변1

안에 sh,

# src/main/scala/progscala2/toolslibs/secho

주석이며 무시됩니다.

exec scala "$0" "$@"

현재 프로세스가 자신을 으로 대체 scala하고 모든 셸 매개변수를 인수로 대체합니다.

!#

이 시점에서 쉘이 스크립트 읽기를 중지했기 때문에 아무런 효과가 없습니다.

그러나 Scala는 파일 시작 부분의 "헤더"를 무시하여 스크립트 파일을 처리합니다. 해당 헤더는 #!(또는 Windows의 경우) 시작하는 줄에서 시작 ::#!하고 다음 줄로 끝납니다.( !#) ::!#또는/env. 헤더는 한 줄일 수 있으므로 둘 다

#!/path/to/scala
!#
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

그리고

#!/usr/bin/env scala
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

작업합니다(후자는 scala에 있어야 함 PATH). 후자는 다음과 같습니다.문서.

( !#는 의 대칭 이며 Scala에서 C의 주석 과 유사한 방식으로 에 #!의해 열린 "헤더"를 닫는 데 사용됩니다 .)#!/**/

관련 정보