使用 bash -c 将所有参数传递给在新 shell 中调用的命令

问题描述 投票:0回答:2

我已将示例简化为以下内容:

文件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 ''

bash shell
2个回答
2
投票

使用不同的引用将

file1.sh
更改为:

#!/bin/bash
bash -c './file2.sh "$@"' - "$@"

- "$@"
正在传递连字符来填充
$0
,并且
$@
正在传入以填充
bash -c
命令行中的所有其他位置参数。

你也可以做到:

bash -c './file2.sh "$@"' "$0" "$@"

但是这里没有真正需要使用

bash -c
,你可以只使用:

./file2.sh "$@"

0
投票

其实

bash -c "./file2.sh \$@" -- "$@"
也有效。

用单引号转义与直接在双引号内使用它具有相同的效果。

© www.soinside.com 2019 - 2024. All rights reserved.