Когда вы присваиваете этот массив:
backup_cmd=(sudo -u postgres sh -c '/usr/bin/pg_dump -U postgres -Fc database > /path/to/file')
Вы не хотите, чтобы это передавалось вашей функции:
cmd_exec $backup_cmd
В этом случае будет передан только первый элемент массива, т.е. sudo
.
Вы должны передать элементы массива как двойные кавычки:
cmd_exec "${backup_cmd[@]}"
Нет необходимости сохранять параметры в локальной переменной cmd
в вашей функции, вы можете использовать параметры функции как $@
вместо:
# Command execution
# Executes a given command, redirect stdout to stderr, prints output and returns exit code
# Function arguments:
# - $@: the command to be executed along with its arguments
cmd_exec() {
exec 5>&2
echo "Executing command '$cmd' ..."
output=`"$@" 2>&1 |tee /dev/fd/5; exit ${PIPESTATUS[0]}`
status=$?
echo "Command exited with status code: $status"
echo
echo "$output"
echo
return $status
}
Обратите внимание, что переменные будут не можно развернуть в одинарных кавычках. Другими словами, если вы хотите установить необязательные аргументы, например, так:
backup_cmd=(sudo -u postgres sh -c '$pgdump -U $username -Fc $database > $filename')
Вместо них необходимо использовать двойные кавычки:
backup_cmd=(sudo -u postgres sh -c "$pgdump -U $username -Fc $database > $filename")