script脚本 一次使用 Go 语言编写脚本的经历

11/28 10:18:15 来源网站:辅助卡盟网

script脚本 一次使用 Go 语言编写脚本的经历

Go 语言区别于 Bash 和 Python 的地方是后者通过解释执行,既它们的脚本在读取的时候执行。而对于 Go 语言,当用户输入了 go run,Go 编译这个 Go 程序,然后再执行。因为 Go 编译时间非常短,所以看上去像是解释执行。值得提醒的是,很多人都说“go run 只是一个玩具”,但是如果我们需要脚本,同时也喜欢 Go 语言,那么这个玩具就是我们想要的。

3 所以已经支持的很好了,对吧?

我们可以编写脚本,并通过 go run 命令来执行。还有什么问题呢?问题是我很懒,希望通过类似./my-script.go 的方式来运行脚本,而不是 go run my-script.go。

这里我们讨论一个简单的脚本和 Shell 通过两种方式进行交互:它从命令行获取输入数据,并设置退出状态码。二者并非所有可能的交互方式(除此之外还可以有环境变量、信号、标准输入、标准输出、标准错误等),但是 Shell 脚本中较困难的两个。

这个脚本输出“Hello”和从命令行获取的第一个参数,并设置退出状态码为 42:

package main
import ( "fmt" "os")
func main() { fmt.Println("Hello", os.Args[1]) os.Exit(42)}

这时,使用 go run 命令结果有些奇怪:

$ go run example.go worldHello worldexit status 42$ echo $?1

这个问题我们稍后会讨论。

这时候可以使用 go build 命令。这是通过 go build 命令执行该脚本的方式:

$ go build$ ./example worldHello world$ echo $?42

此时调试该脚本的流程变成了:

$ vim ./example.go$ go build$ ./example.go worldHi world$ vim ./example.go$ go build$ ./example.go worldBye world

而我期望达到的是这样来运行脚本:

$ chmod +x example.go$ ./example.go worldHello world$ echo $?42

而对应的工作流程是:

$ vim ./example.go$ ./example.go worldHi world$ vim ./example.go$ ./example.go worldBye world

看上去很简单是吧?

4 Shebang

类 UNIX 系统支持 Shebang。Shebang 用于告诉 Shell 使用什么解释器来运行脚本。我们可以根据编写脚本使用的语言来设置 Shebang 行。

通常来说,我们会使用 env 命令最为脚本执行器,这样就无需再使用解释器的绝对路径。例如:可以设置 Shebang 为 #! /usr/bin/env python 让 Python 解释器来运行该脚本。当名称为 example.py 的脚本有上述的 Shebang 行,同时它具有可执行属性(可以通过 chmod +x example.py 命令添加)时,可以在 Shell 中输入./example.py arg1 arg2 来运行。此时 Shell 会读取 Shebang 行,然后开始链式反应:

Shell 开始运行 /usr/bin/env python example.py arg1 arg2。这实际就是 Shebang 行加上脚本名再加上额外的参数。该命令执行 /usr/bin/env,参数是 /usr/bin/env python example.py arg1 arg2。然后 env 命令调用 python 命令,执行 python example.py arg1 arg2。最后 python 运行 example.py 脚本,参数是 example.py arg1 arg2。

    暂无相关资讯
script脚本 一次使用 Go 语言编写脚本的经历