Estoy trabajando en un script y necesito construir el tar
comando dinámicamente.
Aquí hay dos ejemplos para ilustrar lo que estoy tratando de hacer:
#!/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"
Quiero poder usarlo _tar
como comando, pude hacerlo funcionar con la ruta clásica, pero necesito que funcione con espacios en el nombre de las carpetas. Y cada vez recibí errores que se ven así:
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
Solo una cosa que necesita saber, necesito que mi script funcione en máquinas muy antiguas, lo que significa que no puedo usar las últimas funciones de bash.
bash
shell-script
tar
string
ShellCode
fuente
fuente
eval
delante de la ejecución?Respuestas:
No intentes hacer una cadena ejecutable. En su lugar, cree los argumentos en una matriz y úselos cuando llame
tar
(ya está usando una matriz correctamente paraEXCLUDE
):Con
/bin/sh
:Tenga en cuenta la cita de
$@
en elsh
código y de ambos${exclude[@]}
y${exclude_opts[@]}
en elbash
código. Esto garantiza que las listas se expandan a elementos citados individualmente.Relacionado:
fuente
Extendiendo la respuesta aquí . Esto no depende de ningún bashismo, también funcionará bien con Debian
/bin/sh
y conbusybox
.fuente
set -x
. ¿Qué es exactamente lo que no entiendes?