当前,我有一个脚本,可以进行一些额外的处理,但是最终会调用用户传递的命令(仅供参考,这是为了在Docker容器中运行某些命令,但是我们将其称为foo.sh
):< / p>
#!/usr/bin/env bash
# ...
runner "$@"
这很好用(例如foo.sh echo HI
),直到用户希望传递多个要运行的命令:
例如:foo.sh echo HI && echo BYE
&&
当然在传递给参数之前由环境外壳解释。
有没有可行的变通方法或转义&&
的方法?
答案 0 :(得分:2)
在这种情况下经常有用的成语:
cmds_q='true'
add_command() {
local new_cmd
printf -v new_cmd '%q ' "$@"
cmds_q+=" && $new_cmd"
}
add_command echo HI
add_command echo BYE
runner bash -c "$cmds_q"
这里的最大优点是add_command
可以用任意参数调用(当然,在第一个参数定义要运行的命令之后),而不会冒将这些参数解析为语法/在注入攻击中使用的风险,只要呼叫者从不直接修改cmds_q
。