Я работаю над сценарием, и мне нужно построить tar
команду динамически.
Вот два примера, чтобы проиллюстрировать, что я пытаюсь сделать:
#!/bin/bash
TAR_ME="/tmp"
EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*")
_tar="tar "`printf -- '--exclude="%s" ' "${EXCLUDE[@]}"`" -zcf tmp.tar.gz"
echo COMMAND: "${_tar}"
${_tar} "$TAR_ME"
echo -e "\n\nNEXT:\n\n"
EXCLUDE=("--exclude=/tmp/hello\ hello" "--exclude=/tmp/systemd*" "--exclude=/tmp/Temp*")
_tar="tar "`printf -- '%s ' "${EXCLUDE[@]}"`" -zcf test.tar.gz"
echo COMMAND: "${_tar}"
${_tar} "$TAR_ME"
Я хочу иметь возможность использовать _tar
в качестве команды, я смог заставить ее работать с классическим путем, но мне нужно, чтобы она работала с пробелами в имени папки. И каждый раз, когда я получаю ошибки, которые выглядят так:
COMMAND: tar --exclude="/tmp/hello hello" --exclude="/tmp/systemd*" --exclude="/tmp/Temp*" -zcf tmp.tar.gz /tmp
tar: hello": Cannot stat: No such file or directory
COMMAND: tar --exclude=/tmp/hello\ hello --exclude=/tmp/systemd* --exclude=/tmp/Temp* -zcf test.tar.gz
tar: hello: Cannot stat: No such file or directory
Только одна вещь, которую вам нужно знать, мне нужен мой скрипт для работы на очень старых машинах, то есть я не могу использовать последние функции bash.
bash
shell-script
tar
string
Shellcode
источник
источник
eval
перед казнью?Ответы:
Не пытайтесь создать исполняемую строку. Вместо этого соберите аргументы в массиве и используйте его при вызове
tar
(для этого вы уже правильно используете массивEXCLUDE
):С
/bin/sh
:Обратите внимание на цитирование
$@
вsh
коде и того и другого${exclude[@]}
и${exclude_opts[@]}
вbash
коде. Это гарантирует, что списки будут расширены до отдельных элементов в кавычках.Связанные с:
источник
Расширяя ответ здесь . Это не зависит от каких-либо ошибок, также будет хорошо работать с Debian
/bin/sh
и сbusybox
.источник
set -x
. Что именно вы не понимаете?