Невозможно записать в смонтированный каталог (после chown)

Всякий раз, когда вам нужно указать список путей или путей с именами файлов, или просто список, который вы собираетесь перебирать и/или использовать в качестве списка аргументов какой-либо команды, используйте массив.

Если вы используете не массив, а строку, вы не сможете обрабатывать вещи с пробелами в них (, потому что вы используете пробелы в качестве разделителя в строке ). Это также затрудняет перебор содержимого строки, так как вам придется вызывать разбиение на слова (, не заключая в кавычки раскрытие переменной ). Но это также приведет к подстановке имен файлов, если вы явно не отключите это с помощью set -f.

В большинстве оболочек, даже в простом /bin/sh, вместо этого используйте массив. В shиспользуйте массив позиционных параметров ($@).

Для bashиспользуйте массив строк в кавычках, например

excludes=( '/home/*/.cache/*'
           '/var/cache/*'
           '/var/tmp/*'
           '/var/lib/lxcfs/cgroup/*' )

Затем,

rsync_opts=( --verbose --archive )
for excl in "${excludes[@]}"; do
    rsync_opts+=( --exclude="$excl" )
done

Позже,

rsync "${rsync_opts[@]}" source/ target

Обратите внимание, что кавычки важны во всех приведенных выше раскрытиях переменных. Расширение "${array[@]}"(, а также "$@"ниже )приводит к списку отдельных элементов рассматриваемого массива (, но только в двойных кавычках! ).

Для любой /bin/shоболочки:

set -- '/home/*/.cache/*'  \
       '/var/cache/*'      \
       '/var/tmp/*'        \
       '/var/lib/lxcfs/cgroup/*'

for excl do
    set -- "$@" --exclude="$excl"
    shift
done
set -- --verbose --archive "$@"

rsync "$@" source/ target
0
26.08.2020, 01:46
0 ответов

Теги

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