Ich arbeite an einem Skript und muss den tar
Befehl dynamisch erstellen .
Hier sind zwei Beispiele, um zu veranschaulichen, was ich versuche:
#!/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"
Ich möchte in der Lage sein, _tar
als Befehl zu verwenden. Ich konnte ihn mit dem klassischen Pfad arbeiten lassen, aber ich brauche ihn, um mit Leerzeichen im Ordnernamen zu arbeiten. Und jedes Mal bekam ich Fehler, die aussehen wie:
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
Nur eine Sache, die Sie wissen müssen: Ich brauche mein Skript, um auf sehr alten Maschinen zu arbeiten, was bedeutet, dass ich die letzten Bash-Funktionen nicht verwenden kann.
bash
shell-script
tar
string
ShellCode
quelle
quelle
eval
vor der Hinrichtung?Antworten:
Versuchen Sie nicht, eine ausführbare Zeichenfolge zu erstellen. Erstellen Sie stattdessen die Argumente in einem Array und verwenden Sie diese beim Aufruf
tar
(für die Sie bereits ein Array ordnungsgemäß verwendenEXCLUDE
):Mit
/bin/sh
:Beachten Sie das Zitieren von
$@
imsh
Code und von beiden${exclude[@]}
und${exclude_opts[@]}
imbash
Code. Dadurch wird sichergestellt, dass die Listen zu individuell zitierten Elementen erweitert werden.Verbunden:
quelle
Erweitern Sie die Antwort hier . Dies hängt nicht von irgendwelchen Bashismen ab, es wird auch gut mit Debians
/bin/sh
und mit funktionierenbusybox
.quelle
set -x
. Was genau verstehst du nicht?