使用Go运行带参数的bash文件

我正在尝试运行具有如下参数的 bash 脚本:

./test.sh param1 param2

bash文件

param1=$1
param2=$2

echo $param1
echo $param2

但是它不起作用,但如果参数不存在,它将起作用。

cmd, _ := exec.Command("/bin/sh", fmt.Sprintf("./test.sh %s %s","test1","test2")).Output()

但是,如果我更改 bash 脚本以执行其他操作而不将任何内容传递给它,那么它就可以工作。

cmd, _ := exec.Command("/bin/sh", "./test.sh").Output()

如何使用 Go 将参数传递到 bash 文件中?

回答

sh期望脚本的名称作为其参数运行。您不是sh './test.sh test1 test2'在 shell 上运行,而是运行sh ./test.sh test1 test2. 在 Go 中的等价物是:

// KINDA BAD: Doesn't let the script choose its own interpreter
cmd, err := exec.Command("/bin/sh", "./test.sh", "test1", "test2")

如果您将shell 脚本作为参数传递,那将类似于 shell 命令sh -c './test.sh test1 test2'——注意-c参数。这是非常糟糕的做法(引入了严重的安全漏洞),你永远不应该这样做,但如果你打算这样做,它看起来像:

// VERY BAD: Introduces serious security bugs if arguments are parameterized
cmd, err := exec.Command("/bin/sh", "-c", "./test.sh test1 test2")

但你不应该这样做。更改您的脚本以进行shebang:

#!/bin/sh
param1=$1
param2=$2

echo "$param1"
echo "$param2"

...另存为yourscript(不.sh!),将其设置为具有可执行权限(chmod +x yourscript),然后运行:

// GOOD: Lets your script choose its own interpreter
cmd, err := exec.Command("./yourscript", "test1", "test2")


以上是使用Go运行带参数的bash文件的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>