О передаче аргументов программам через переменные массива

В настоящее время Linux наследует стандартный контроль доступа Unix "rwx". Это означает, что без серьезной переделки текущей модели разрешений невозможно запретить владельцу файла удалить файл, хотя ядро имеет возможность ограничить это. (Ядро действительно управляет вашими файлами и может запретить любую активность пользователя, но текущее ядро имеет слишком мало битов разрешений для контроля)

Если вы не пользователь root, то вы можете попробовать установить режим только для владельца, например, chmod 444 file. Обратите внимание, что для изменения файла вам придется каждый раз устанавливать бит записи обратно. А некоторые программы (например, vim) могут автоматически сбросить этот бит без предупреждения, но по умолчанию они этого не делают.

Неизменяемый флаг помогает, только если у вас есть механизм - sudo или подобный, который дает вам право изменять его как непривилегированному пользователю.

См. также Существуют ли более продвинутые ACL файловой системы помимо традиционных 'rwx' и POSIX ACL?. ACL (не POSIX) могут решить эту проблему, определив разрешение remove.

3
06.03.2016, 22:14
1 ответ

Проблема в том, что, написав "- exclude = '$ item'" , вы помещаете одинарные кавычки в исключение шаблон. Итак, вы исключаете '/ foo' и так далее, но, вероятно, у вас нет файлов с именами, начинающимися и заканчивающимися одинарными кавычками.

Вам нужно написать

EXCLUDES+=( "--exclude=$item" )

или, поскольку это zsh, вам не нужны двойные кавычки: просто напишите

EXCLUDES+=( --exclude=$item )

или, поскольку это zsh, вам не нужен цикл: просто используйте ^ опция расширения параметра :

rsync -a --exclude=$^EXCLUDE_ITEMS …

В ksh или bash вам понадобится цикл и двойные кавычки повсюду:

EXCLUDES=()
for item in "${EXCLUDE_ITEMS[@]}";  do
  EXCLUDES+=( "--exclude=$item" )
done
rsync -a "${EXCLUDES[@]}" …
3
27.01.2020, 21:22

Теги

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