Как передать несколько команд одной команде в bash, используя &&? - PullRequest
0 голосов
/ 16 мая 2019

В настоящее время у меня есть скрипт, который выполняет некоторую дополнительную обработку, но в конечном итоге вызывает команду, которую передал пользователь (к вашему сведению, это для запуска некоторых команд в контейнере Docker, но мы будем называть его foo.sh):

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

Это прекрасно работает (например, foo.sh echo HI), пока пользователи не захотят передать несколько команд для запуска:

Например: foo.sh echo HI && echo BYE

&& имееткурс, интерпретируемый окружающей оболочкой перед передачей в аргументы.

Есть ли обходной путь или способ избежать &&, который может сработать?

1 Ответ

2 голосов
/ 16 мая 2019

Фраза, которая часто пригодится для такого случая:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...