Pracuję nad skryptem i muszę tar
dynamicznie budować polecenie.
Oto dwa przykłady ilustrujące to, co próbuję zrobić:
#!/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"
Chcę móc używać _tar
jako polecenia, udało mi się sprawić, aby działał z klasyczną ścieżką, ale potrzebuję go do pracy ze spacjami w nazwie folderów. I za każdym razem mam błędy, które wyglądają jak:
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
Tylko jedna rzecz, którą musisz wiedzieć: potrzebuję mojego skryptu do pracy na bardzo starych maszynach, co oznacza, że nie mogę korzystać z funkcji ostatniego basha.
bash
shell-script
tar
string
ShellCode
źródło
źródło
eval
przed egzekucją?Odpowiedzi:
Nie próbuj tworzyć wykonywalnego ciągu. Zamiast tego buduj argumenty w tablicy i używaj tego podczas wywoływania
tar
(już używasz poprawnie tablicyEXCLUDE
):Z
/bin/sh
:Zwróć uwagę na cytowanie
$@
wsh
kodzie i zarówno w kodzie, jak${exclude[@]}
i${exclude_opts[@]}
wbash
kodzie. Zapewnia to, że listy są rozwijane do indywidualnie cytowanych elementów.Związane z:
źródło
Rozszerzając odpowiedź tutaj . To nie opiera się na żadnych baszizmach, będzie również działało dobrze z debianem
/bin/sh
ibusybox
.źródło
set -x
. Czego dokładnie nie rozumiesz?