我已将示例简化为以下内容:
文件1.sh:
#!/bin/bash
bash -c "./file2.sh $@"
file2.sh:
#!/bin/bash
echo "first $1"
echo "second $2"
我希望如果我打电话给
./file1.sh a b
得到:
first a
second b
但我得到的是:
first a
second
换句话说,第一个参数之后的参数没有传递到我在新的 bash shell 中执行的命令。我尝试了多种删除和移动 file1.sh 文件中引号的方法,但还没有成功。
为什么会发生这种情况?我如何获得我想要的行为?
(更新 - 我意识到在这个例子中调用 bash -c 似乎毫无意义,我实际的 file1.sh 是一个命令的代理脚本,该命令在本地调用以在 docker 容器中运行,所以它实际上是
docker exec -i mycontainer bash -c ''
)
使用不同的引用将
file1.sh
更改为:
#!/bin/bash
bash -c './file2.sh "$@"' - "$@"
- "$@"
正在传递连字符来填充 $0
,并且 $@
正在传入以填充 bash -c
命令行中的所有其他位置参数。
你也可以做到:
bash -c './file2.sh "$@"' "$0" "$@"
但是这里没有真正需要使用
bash -c
,你可以只使用:
./file2.sh "$@"
其实
bash -c "./file2.sh \$@" -- "$@"
也有效。
用单引号转义与直接在双引号内使用它具有相同的效果。