使用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")