Если у вас есть команда в форме:
args="--foo 'bar baz' qux"
и получение команды в виде массива, во-первых, не вариант, тогда вам нужно будет использовать eval
, чтобы превратить ее обратно в массив:
$ args="--foo 'bar baz' qux"
$ eval "arr=($args)"
Но важно отметить, что это небезопасно , если $args
предоставляется ненадежным источником, поскольку его можно использовать для выполнения произвольных команд, например, args='$(rm -rf /)'; eval "arr=($args)"
заставит приведенный выше код запустить rm -rf /
еще до того, как вы использовали arr
.
Затем вы можете использовать "${arr[@]}"
, чтобы расширить его в качестве аргументов команды:
$ bash -c 'echo $0' "${arr[@]}"
--foo
$ bash -c 'echo $1' "${arr[@]}"
bar baz
или для запуска вашей команды:
"$command" "${arr[@]}"
Обратите внимание, что есть различия между ${arr[*]}
, ${arr[@]}
, "${arr[*]}"
и "${arr[@]}"
, и только последний из них делает то, что вы хотите в большинстве случаев