我最近才刚开始对scala进行编程,在《 Programming in Scala》(www.artima.com/pins1ed)一书中,介绍了以下在Linux中执行scala脚本的方法:
#!/bin/sh
exec scala "$0" "$@"
!#
// Say hello to the first argument
println("Hello, "+ args(0) +"!")
现在我已经使用Linux很长时间了,但是bash脚本并不是我的专长。现在我可以猜测这种类型的scrpt的工作原理(并且工作得很漂亮),但是我想知道!#和$ @到底能做什么。
在此先感谢您提供的所有帮助!
最佳答案
确实美丽。 $0
和"$@"
是位置参数($0
=命令本身,就像C语言中的argv[0]
,而argv[1]+
则是"$@"
),而#!*
告诉 shell 程序,有时还告诉内核它是否识别出要对文件执行的程序。
实际上发生的事情是 shell 程序打开脚本以读取输入,但是在exec
上,它将输入传输到scala,但是scala不必从头开始再次读取它,因为文件描述符仍处于打开状态因此,scala会继续在下一行阅读。
我很少看到这样的脚本,它们以明显而简单的方式演示其功能。
请注意,exec
替换了运行脚本的shell的过程,因此就像shell成为scala一样,但是scala具有相同的环境变量和打开的处理程序。
更新
看来我错了。 Scala本身会读取整个内容,但会跳过它在标题行中看到的内容。所以这是!#
的真正目的:
脚本文件可能具有可选的 header ,如果存在的话,会被忽略。有两种格式化标题的方法:以#!开头。以!#结束,或以::#开始!并以::!#结尾。