Saya sedang mengerjakan skrip dan saya perlu membangun tar
perintah secara dinamis.
Berikut adalah dua contoh untuk menggambarkan apa yang saya coba lakukan:
#!/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"
Saya ingin dapat menggunakan _tar
sebagai perintah, saya bisa membuatnya bekerja dengan jalur klasik, tetapi saya membutuhkannya untuk bekerja dengan spasi di nama folder. Dan setiap kali saya mendapatkan kesalahan yang terlihat seperti:
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
Hanya satu hal yang perlu Anda ketahui, saya perlu skrip saya untuk bekerja pada mesin yang sangat lama, artinya saya tidak dapat menggunakan fitur bash terakhir.
bash
shell-script
tar
string
ShellCode
sumber
sumber
eval
di depan eksekusi?Jawaban:
Jangan mencoba membuat string yang dapat dieksekusi. Alih-alih membangun argumen dalam array dan menggunakannya saat memanggil
tar
(Anda sudah menggunakan array dengan benar untukEXCLUDE
):Dengan
/bin/sh
:Perhatikan mengutip dari
$@
dalamsh
kode dan kedua${exclude[@]}
dan${exclude_opts[@]}
dibash
kode. Ini memastikan bahwa daftar diperluas ke elemen-elemen yang dikutip secara individual.Terkait:
sumber
Memperluas jawabannya di sini . Ini tidak bergantung pada bashisme apa pun, ini juga akan bekerja dengan baik pada debian
/bin/sh
, dan denganbusybox
.sumber
set -x
. Apa sebenarnya yang tidak kamu mengerti?