各位游戏大佬大家好,今天小编为大家分享关于GG游戏修改器脚本执行错误_gg修改器游戏脚本大全的内容,轻松修改游戏数据,赶快来一起来看看吧。
本文介绍了我如何尝试使用 Go 语言进行脚本编程的经历。文中我将讨论 Go 脚本的必要性,我们预期的表现以及可能的实现方式。在讨论过程中,我讲深入探讨脚本、Shell 和 Shebang。最终,我们将会讨论让 Go 脚本工作的解决方案。
通常认为,Python 和 Bash 是热门的脚本语言,而 C、C++ 和 Java 完全不能被用作脚本编程,有一些语言却夹在其中。
Go 语言试用场景很多,从编写 Web 服务器到流程管理,甚至有些人用作系统编程语言。在后文中,我将论证,除了上述这些场景外,Go 语言还可以简单地用于编写脚本。
是什么让 Go 语言适合编写脚本?
事实上,我已经可以使用 Go 语言来编写脚本。这需要使用 Go 的 run 子命令:如果脚本名称是 my-script.go,我们可以简单的通过 go run my-script.go 来运行。
这里,对于 go run 命令,我认为需要特别关注一下。让我们详细说明下。
Go 语言区别于 Bash 和 Python 的地方是后者通过解释执行,既它们的脚本在读取的时候执行。而对于 Go 语言,当用户输入了 go run,Go 编译这个 Go 程序,然后再执行。因为 Go 编译时间非常短,所以看上去像是解释执行。值得提醒的是,很多人都说“go run 只是一个玩具”,但是如果我们需要脚本,同时也喜欢 Go 语言,那么这个玩具就是我们想要的。
我们可以编写脚本,并通过 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 world
Hello world
exit status 42
$ echo $?
1
这个问题我们稍后会讨论。
这时候可以使用 go build 命令。这是通过 go build 命令执行该脚本的方式:
$ go build
$ ./example world
Hello world
$ echo $?
42
此时调试该脚本的流程变成了:
$ vim ./example.go
$ go build
$ ./example.go world
Hi world
$ vim ./example.go
$ go build
$ ./example.go world
Bye world
而我期望达到的是这样来运行脚本:
$ chmod +x example.go
$ ./example.go world
Hello world
$ echo $?
42
而对应的工作流程是:
$ vim ./example.go
$ ./example.go world
Hi world
$ vim ./example.go
$ ./example.go world
Bye world
看上去很简答是吧?
类 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。
让我们开始尝试给 Go 脚本添加 Shebang。
1、 第一次幼稚的尝试
我们首先设置一个幼稚的 Shebang 来使用 go run 执行这个脚本。加了 Shebang 之后的脚本看上去是这样的:
#! /usr/bin/env go run
package main
import (
“fmt”
“os”
)
func main() {
fmt.Println(“Hello”, os.Args[1])
os.Exit(42)
}
然后尝试运行一下,输出为:
$ ./example.go
/usr/bin/env: ‘go run’: No such file or directory
发生了什么?
Shebang 机制将 go run 整体作为 env 命令的一个参数了,而实际不存在这个命令。输入 which “go run” 也会有类似的错误。
2 、第二次尝试
一个可行的方案是将 Shebang 设置为 #! /usr/local/go/bin/go run。在我们尝试之前,就可以会发现一个问题:go 二进制文件在不同系统路径不同,写死绝对路径会导致脚本无法兼容安装在其他位置的 go。另外一个解决方案是使用 alias gorun=”go run” 来创建一个别名,之后就能把 Shebang 修改成 #! /usr/bin/env gorun。使用这种方式,我们需要在运行这个脚本的系统中都设置这个别名。
输出:
$ ./example.go
package main:
example.go:1:1: illegal character U+0023 ’#’
解释:
从这个输出来看,我们有一个好消息,同时也有一个坏消息,你想先听哪个?我先来说好消息:-)
3、 解决方案
当脚本不包含 Shebang 行时,不同的 Shell 会回退到不同的解析器。Bash 会使用自己来运行脚本,而 zsh 会回退到使用 sh。这给我们提供了一种解决方案,这也是StackOverflow上提到的一种解决方案。
由于 // 是 Go 语言中定义的注释,而我们可以使用 //usr/bin/env 来替代 /usr/bin/env(在路径分割符中,// == /),因此第一行可以设置成:
//usr/bin/env go run “$0” “$@”
结果:
$ ./example.go world
Hi world
exit status 42
./test.go: line 2: package: command not found
./test.go: line 4: syntax error near unexpected token `newline’
./test.go: line 4: `import (’
$ echo $?
2
解释:
我们距离成功又近了一步:终于有了正确的输出。但是输出中还包含一些错误,同时状态码也不对。让我们来看下到底发生了什么。正如之前所说的,Bash 没有找到任何 Shebang,因此选择使用 bash ./example.go world 的方式来运行脚本(直接使用该命令会有相同输出,你也可以试下)。非常有意思,直接使用 Bash 来运行 Go 文件 🙂 下一步,Bash 读取脚本的第一行,然后运行该命令:/usr/bin/env go run ./example.go world。之前脚本中的“0”代表第一个参数,因此实际值是我们运行的脚本文件名。“
0”代表第一个参数,因此实际值是我们运行的脚本文件名。“@”表示命令行中的所有参数。在这个例子中会被替换成“world”。到目前位置,使用./example.go world,脚本使用了正确的命令行参数,并输出了正确的值。
输出中还有诡异的一行:“exit status 42”。这是什么?如果我们自己尝试下命令就会了解:
$ go run ./example.go world
Hello world
exit status 42
$ echo $?
1
这是 go run 命令通过标准错误输出的。go run 命令屏蔽了状态码,然后返回了状态码 1。关于这个行为的讨论,可以参见Github issue。
好了,那么其他几行输出呢?这是 Bash 试图解析 Go 源码,但实际失败了。
4 、解决方案优化
这个 StackOverflow 页面建议在 Shebang 之后加上 ;exit “$?”。这会告诉 Bash 解释器不要再继续执行。
完整的 Shebang:
//usr/bin/env go run “$0” “$@”; exit “$?”
结果:
$ ./test.go world
Hi world
exit status 42
$ echo $?
1
基本上实现了:这里实现了让 Bash 使用 go run 命令执行脚本,然后立即退出,同时设置状态码为 go run 命令执行后的状态码。
更进一步,可以在 Shebang 行中添加一些命令,用于移除标准错误中的“退出状态”内容,甚至解析该文本并作为整个脚本的返回码。
然而:
幸运的是,我们有gorun
gorun 就是我们想要的。我们只需在 Shebang 中写 #! /usr/bin/env gorun,并赋予脚本可执行权限。仅此而已,我们可以在 Shell 中执行,获得期望的结果!
$ ./example.go world
Hello world
$ echo $?
42
太棒了!
警告:兼容性
当文件包含 Shebang 之后,Go 将无法编译(和我们之前看见的一样)。
$ go run example.go
package main:
example.go:1:1: illegal character U+0023 ’#’
这两种选择不能兼得,我们只能二选一:
二者不可兼得!
另外一个问题,是当脚本文件被放在 Go 工程中时,编译器会发现这个 go 文件。虽然该文件并不是应用程序所需要的,也会导致编译失败。一个解决方案是移除.go 后缀,但是这样就会无法使用类似 go fmt 等工具。
本文讨论了使用 Go 语言来编写脚本的重要性,同时介绍了几种方式来实现脚本运行。这里有一些总结。
类型退出状态码可执行可编译标准go run✘✘✔✔gorun✔✔✘✘// 解决方案✘✔✔✔
解释:
正如上表,目前没有一种完美的解决方案。看上去最方便且问题最少的方式是使用 go run 命令。但是在我看来,这种方式太过“复杂”,而且无法“可执行”,同时退出状态码也不正确。这将会导致难以区分脚本是否正确执行。
因此,我认为 Go 语言在这个领域仍然有许多工作要做。我不认为让语言支持忽略 Shebang 行会有什么问题。这将会解决执行问题,但是类似这种变化可能不会被 Go 社区采纳。
我的同事提醒我事实上 Shebang 行对于 Javascript 同样也是非法的。但是在 Node.js 中,他们增加了一个跳过 Shebang函数,让 Node 脚本可以在 Shell 中直接运行。(译者注:由于原文时间比较久远,在c2b01881dcb3bf302f9d83157e719cc5240a9042版本之后 Node.js 已经对源码进行了重构,在702331be906fe58e0ef66c7b31c7d2aeb3af3421版本之后,原文提及的 stripShebang 函数已经被移除。)
如果 gorun 可以作为标准工具的一部分就更棒了,其他类似的还有 gofmt 和 godoc。
原文链接:
https://posener.github.io/go-shebang-story/
以上就是关于GG游戏修改器脚本执行错误_gg修改器游戏脚本大全的全部内容,游戏大佬们学会了吗?
gg修改器无root防闪退,下载软件必备:gg修改器无root防闪退 分类:免root版 4,127人在玩 如果你是一位Android手机用户,那么你一定会接触到各种应用和游戏。有时候你可能需要通过一些外部工具来修改或者优化这些应用和游戏,而此时一个强大的修改器就可以帮助你达成目标……
下载gg修改器的root怎么下载,下载gg修改器root版,畅享游戏乐趣 分类:免root版 3,575人在玩 您是否曾经遇到过游戏中的难关,需要金币或者道具才能过关?是否感到游戏内购买昂贵,不划算?那么,您需要一个可以解决这些问题的工具——gg修改器root版本。 什么是gg修改器root版……
下载gg修改器免root版冷冰雪,下载冷冰雪GG修改器免root版,畅享游戏无限乐趣 分类:免root版 4,639人在玩 现如今,手游已成为人们生活中不可或缺的一部分。而想要在游戏中获得胜利,拥有强大的游戏角色是必不可少的。然而,很多玩家因为自身实力不足,而在游戏中屡屡碰壁。那么,这时候就……
下载gg修改器怎样用无root,软件下载:使用无root的GG修改器 分类:免root版 4,421人在玩 如果你是一位游戏玩家,那么你一定知道GG修改器这个工具。它可以让你在游戏中改变一些参数,比如金币数、等级、血量等等。然而,以往使用这个工具需要对手机进行root,这使很多人望……
下载怎么免root进gg修改器,软件下载:轻松免Root进入GG修改器 分类:免root版 2,579人在玩 你是否曾经想要使用GG修改器却因为不想Root手机而放弃?现在,我们为你带来了一款方便易用的软件,可以免Root进入GG修改器。这个软件非常适合想要体验游戏辅助但又担心Root手机安全……
下载gg修改器 平行root,下载GG修改器平行root,让你的游戏更加畅快 分类:免root版 4,732人在玩 GG修改器平行root是一款优秀的游戏修改工具,它可以帮助玩家在游戏中获得更多的金钱、经验等资源。此外,该软件还支持一键加速,让你的游戏更加流畅。下面就来详细介绍一下GG修改器……
下载黑科技gg修改器免root,下载黑科技gg修改器免root,让你体验不一样的游戏乐趣 分类:免root版 2,414人在玩 如果您是一位喜欢玩手机游戏的人,那么您一定会遇到这样的问题:由于手机系统限制,您无法修改游戏数据,导致游戏体验不佳。为了解决这个问题,我们推荐一款名为“黑科技gg修改器”的……
下载游戏gg修改器免root,游戏GG修改器免Root:改变游戏体验的神器 分类:免root版 1,755人在玩 如果你是一名游戏玩家,那么你一定会遇到一些游戏难度较高或者某些道具需要花费大量金钱购买的情况。这时候,游戏GG修改器就能为你解决这些问题。与其他修改器不同的是,游戏GG修改……
下载gg修改器root授权,下载gg修改器root授权软件,让你轻松管理手机权限 分类:免root版 2,829人在玩 现在的手机功能越来越强大,但同时也有着更多的应用程序需要获取各种权限才能正常运行。然而,有些应用需要获取的权限过于高级,甚至不安全,这就会给用户带来安全隐患。为了避免这……
下载gg修改器框架免root版下载_GG修改器免root框架 分类:免root版 6,694人在玩 各位游戏大佬大家好,今天小编为大家分享关于gg修改器框架免root版下载_GG修改器免root框架的内容,轻松修改游戏数据,赶快来一起来看看吧。 前言: 2022春节以来,新冠病毒又在全……
下载