我正在用 go 编写一个 bash 任务运行程序,它有一个简单的概念:
- 它读取
taskfile
,这是一个包含任务定义(简单的 bash 函数声明)的 bash 脚本 - 它动态添加附加内容
- 根据传递的参数执行命令
这是一个简化的示例:
package main
import (
"fmt"
"os/exec"
)
func main() {
//simplified for a dynamically built script
taskfilecontent := "#!/bin/bash\n\ntask:foo (){\n echo \"test\"\n}\n"
// simplified for passed arguments
task := "\ntask:foo"
bash, _ := exec.lookpath("bash")
cmd := exec.command(bash, "-c", "\"$(cat << eof\n"+taskfilecontent+task+"\neof\n)\"")
fmt.println(cmd.string())
out, _ := cmd.combinedoutput()
fmt.println(string(out))
}
我现在的问题是,如果通过 go 执行它就不起作用,并且我收到此错误
task:foo: no such file or directory
但是如果我直接在 shell 中执行生成的脚本,它确实有效:
$ /opt/opt/homebrew/bin/bash -c "$(cat << EOF
#!/bin/bash
task:foo (){
echo "test"
}
task:foo
EOF
)"
test <-- printed out from the `task:foo` above
我在这里做错了什么?
正确答案
首先:这里没有任何意义。
你不会得到任何你不会得到的东西:
cmd := exec.command(bash, "-c", taskfilecontent+"\n"+task)
如果省略它,您的代码会更简单。
第二:解释原因
当您在 shell 中运行时:
65be85239床5...围绕 $()
的 "
s 不是正在启动的 bash 副本的语法,而是正在解析命令的 bash 副本的语法。 /em>。它们告诉 bash 的副本,命令替换的结果将作为一个字符串传递,不受字符串分割或通配符的影响。
类似地, $(cat 、
eof
和最终的 )"
也是交互式 shell 的指令,而不是它调用的非交互式 shell。它是运行的交互式 shell cat
(包含连接到其标准输入的heredoc内容的临时文件),读取 cat
副本的标准输出,然后将该数据替换为传递给 bash -c
的单个参数。
在您的 go 程序中,您没有交互式 shell,因此您应该使用 go 语法(而不是 shell 语法)来执行所有这些步骤。就这些步骤而言,没有理由在转到第一个位置(没有必要将数据文件写入临时文件,没有必要让 /bin/cat
读取该文件的内容,没有必要使用子进程运行命令替换来生成一个字符串(由这些内容组成),然后将其放在最终 shell 的命令行中),因此忽略所有这些步骤会更明智。
以上就是使用 Go 执行动态 bash 脚本,包括一行函数声明的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- 如何合理设置缓存池大小?(缓存池大小如何设置)
- 如何轻松进行 java 反汇编?超详细步骤教你快速上手!(如何进行java反汇编)
- 在 Java 中如何实现旧文件内容的覆盖?(java如何将旧文件内容覆盖)
- Java 中如何实现字符串字段的升序排序?(Java字符串字段升序排序怎么实现)
- 如何使用 Java 的 Arrays 类?(详细教程及示例)(java的Arrays类如何使用)
- Java 递归调用会对性能产生哪些影响?(java递归调用的性能影响 )
- Java Solr究竟支持哪些查询语法?(Java Solr支持哪些查询语法)
- Java 中的获取绝对值操作是否能应用于数组?(java获取绝对值能否应用于数组)
- Redis客户端批量操作技巧
- Java 读取文件时导致内存溢出的原因都有哪些?(java读取文件内存溢出的原因有哪些)