如何使用&&在bash中将多个命令传递给单个命令?

时间:2019-05-16 01:46:21

标签: bash

当前,我有一个脚本,可以进行一些额外的处理,但是最终会调用用户传递的命令(仅供参考,这是为了在Docker容器中运行某些命令,但是我们将其称为foo.sh):< / p>

#!/usr/bin/env bash
# ...
runner "$@"

这很好用(例如foo.sh echo HI),直到用户希望传递多个要运行的命令:

例如:foo.sh echo HI && echo BYE

&&当然在传递给参数之前由环境外壳解释。

有没有可行的变通方法或转义&&的方法?

1 个答案:

答案 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