Je travaille sur un script et j'ai besoin de construire la tar
commande dynamiquement.
Voici deux exemples pour illustrer ce que j'essaie de faire:
#!/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"
Je veux pouvoir utiliser _tar
une commande, j'ai pu le faire fonctionner avec un chemin classique, mais j'en ai besoin pour travailler avec des espaces dans le nom des dossiers. Et chaque fois que j'ai des erreurs qui ressemblent à:
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
Juste une chose que vous devez savoir, j'ai besoin que mon script fonctionne sur de très vieilles machines, ce qui signifie que je ne peux pas utiliser les dernières fonctionnalités de bash.
bash
shell-script
tar
string
ShellCode
la source
la source
eval
devant l'exécution?Réponses:
N'essayez pas de créer une chaîne exécutable. Au lieu de cela, créez les arguments dans un tableau et utilisez-le lors de l'appel
tar
(vous utilisez déjà un tableau correctement pourEXCLUDE
):Avec
/bin/sh
:Notez la citation de
$@
dans lesh
code et des deux${exclude[@]}
et${exclude_opts[@]}
dans lebash
code. Cela garantit que les listes sont étendues aux éléments entre guillemets individuels.En relation:
la source
Étendre la réponse ici . Cela ne repose sur aucun bashisme, cela fonctionnera également très bien avec Debian
/bin/sh
et avecbusybox
.la source
set -x
. Qu'est-ce que tu ne comprends pas exactement?