Попробуйте обновить прошивку Lenovo (последняя версия - N1CET46W (1.14)). Проверить можно с помощью команды:
sudo dmidecode -s bios-version
Новая прошивка должна помочь.
Вам нужно построить командную строку дублирования, используя массив, а не простую конкатенацию строк. Затем вы можете использовать синтаксис "$ {array [@]}"
, чтобы предоставить содержимое массива для дублирования как отдельные (возможно, содержащие пробелы) аргументы. Это избавит вас от необходимости думать о побеге из пробелов или других необычных персонажей.
Чтобы увидеть, как это работает, не вызывая фактического дублирования, вы можете использовать простой скрипт, который распечатывает свои аргументы в отдельных строках, например:
#!/bin/bash
printf "BEGIN\n"
for x in "$@"
do
printf "ARG: $x\n"
done
printf "END\n"
Я сохранил это как args.sh
.
Теперь нам нужно создать команду, используя массив, например:
#!/bin/bash
if test -z "$1"
then
printf "Need at least one argument"
exit 1
fi
prefix=$1
shift
for arg in "$@"
do
args+=("--exclude")
args+=("$prefix/$arg")
done
./args.sh "${args[@]}"
В действии это работает следующим образом:
$ ./801811.sh foo bar "baz quux"
BEGIN
ARG: --exclude
ARG: foo/bar
ARG: --exclude
ARG: foo/baz quux
END
Вам нужно будет сделать больше, чтобы настроить вашу командную строку дублирования, поскольку вы также необходимо учитывать $ STUFF
и $ DESTINATION
, но с ними можно справиться таким же образом, добавляя элементы в массив args с помощью args + = ("что угодно")
, до или после добавления исключений, в зависимости от ситуации. Затем, в конце, просто вызовите duplicity "$ {args [@]}"
.
Пробелы здесь - отвлекающий маневр, поскольку расширение заключено в кавычки. Если мы вызываем программу из оболочки следующим образом:
program "$foo_path/$bar_name"
, она получает единственный аргумент, независимо от того, что содержат foo_path
или bar_name
.
Теперь давайте посмотрим на:
--exclude "$2/${4:-__nosuchfiles__}"
Здесь вы хотите стереть всю пару аргументов, если 4
пусто или не существует, в результате получим решение:
$ {4: + - exclude} $ {4: + "$ 2 / $ 4"}
Оператор подстановки параметра : +
- это то, что вам нужно: "если он пуст или не установлен, ничего не заменяйте, в противном случае подставьте альтернатива ». Мы применяем это индивидуально к - исключить
и его аргумент.
Инструменты, которые используют реализацию getopt
(или иным образом сами взламывают поддержку), могут принимать как - exclude = ARG
, так и - исключать ARG
. Если duplicity
работает таким образом, мы можем воспользоваться этим:
$ {4: + "- exclude = $ 2 / $ 4"}
Полная демонстрационная программа test.sh
:
#!/bin/bash
myargs()
{
for x in "$@" ; do printf "<%s>\n" "$x"; done
}
myargs ${1:+--foo-opt} ${1:+"x $1 x"}
Выполнение:
$ ./test.sh
$ ./test.sh "" # blank treated like missing?
$ ./test.sh abc
<--foo-opt>
<x abc x>
$ ./test.sh "ab c"
<--foo-opt>
<x ab c x>