Постройте команду динамически

У меня была такая же проблема с linux-image-3.16.0-4-amd64 с Debian Jessie. Кроме того, это было в моем dmesg после сбоя modprobe, хотя не всегда :

[740079.143533] fat: Unknown symbol __bread_gfp (err 0)
[740079.143558] fat: Unknown symbol __getblk_gfp (err 0)

Решение? Перезагрузка. :-P

9
04.10.2018, 22:30
2 ответа

Не пытайтесь создать исполняемую строку. Вместо этого создайте аргументы в массиве и используйте это при вызове tar(, вы уже правильно используете массив дляEXCLUDE):

#!/bin/bash

directory=/tmp

exclude=( "hello hello" "systemd*" "Temp*" )

# Now build the list of "--exclude" options from the "exclude" array:
for elem in "${exclude[@]}"; do
    exclude_opts+=( --exclude="$directory/$elem" )
done

# Run tar
tar -cz -f tmp.tar.gz "${exclude_opts[@]}" "$directory"

С/bin/sh:

#!/bin/sh

directory=/tmp

set -- "hello hello" "systemd*" "Temp*"

# Now build the list of "--exclude" options from the "$@" list
# (overwriting the values in $@ while doing so):
for elem do
    set -- "$@" --exclude="$directory/$elem"
    shift
done

# Run tar
tar -cz -f tmp.tar.gz "$@" "$directory"

Обратите внимание на цитирование $@в коде shи ${exclude[@]}и ${exclude_opts[@]}в коде bash. Это гарантирует, что списки расширяются до элементов, указанных в кавычках.

Связанные:

14
27.01.2020, 20:06
mix(){
        p=$1; shift; q=$1; shift; c=
        i=1; for a; do c="$c $q \"\${$i}\""; i=$((i+1)); done
        eval "${p%\%*}$c${p#*\%}"
}
mix 'tar % -zcf tmp.tar.gz' --exclude "/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*"

EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*")
mix 'tar % -zcf tmp.tar.gz' --exclude "${EXCLUDE[@]}"

Расширение ответа здесь . Это не зависит от каких-либо башизмов, это также будет хорошо работать с Debian /bin/shи с busybox.

2
27.01.2020, 20:06

Теги

Похожие вопросы