Estou trabalhando em um script e preciso criar o tar
comando dinamicamente.
Aqui estão dois exemplos para ilustrar o que estou tentando fazer:
#!/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"
Eu quero poder usar _tar
como um comando, consegui fazê-lo funcionar com o caminho clássico, mas preciso que ele funcione com espaços no nome das pastas. E toda vez que recebo erros que se parecem com:
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
Apenas uma coisa que você precisa saber: preciso que meu script funcione em máquinas muito antigas, o que significa que não posso usar os últimos recursos do bash.
bash
shell-script
tar
string
ShellCode
fonte
fonte
eval
na frente da execução?Respostas:
Não tente criar uma string executável. Em vez disso, crie os argumentos em uma matriz e use-os ao chamar
tar
(você já está usando uma matriz corretamente paraEXCLUDE
):Com
/bin/sh
:Observe a citação de
$@
nosh
código e de ambos${exclude[@]}
e${exclude_opts[@]}
nobash
código. Isso garante que as listas sejam expandidas para elementos entre aspas individuais.Relacionado:
fonte
Estendendo a resposta aqui . Isso não depende de nenhum basismo, mas também funcionará bem com o debian
/bin/sh
e combusybox
.fonte
set -x
. O que exatamente você não entende?