Да, это может произойти, если Ваше устройство отформатировано с файловой системой, которая не поддерживает такую установку разрешения, такую как VFAT. В тех случаях umask составлен на лету от установки в fstab (или эквивалентная замена в горячем режиме).
Посмотрите, по всей вероятности, человек монтируются для деталей. Например, для VFAT, мы находим:
Смонтируйте опции для жира
uid=value и gid=value
Установите владельца и группу всех файлов. (Значение по умолчанию: uid и ценуроз текущего процесса.)
umask=value
Установите umask (битовая маска полномочий, которые не присутствуют). Значение по умолчанию является umask текущего процесса. Значение подано восьмеричное.
и т.д.
Вместо использования mv
, просто перенаправление cat
. Например:
TMP=$(mktemp)
modifyfile "$original" "$TMP"
cat "$TMP" > "$original"
Это перезаписывает $original
с содержанием $TMP
, ничего не касаясь на уровне файла.
Существует две стратегии заменить файл новой версией:
Создайте временный файл с новой версией, затем переместите ее в место.
Перезапишите старый файл на месте.
Если Вы можете, использовать метод 1, но сначала копировать атрибуты исходного файла с cp -p --attributes-only
. Это требует GNU coreutils (т.е. не встроил Linux или достаточно подобные Linux среды). Если Ваш cp
не имеет --attributes-only
, опустите эту опцию: это будет работать, но это будет копировать данные также.
tmp=$(mktemp)
cp -p --attributes-only "$original" "$tmp"
modifyfile "$original" "$tmp"
mv -f "$tmp" "$original"
Если Вы не можете копировать атрибуты существующего файла, например, потому что Вы имеете полномочия записи на нем, но не владеете им, и Вы хотите сохранить владельца, то только метод 2 возможен. Минимизировать риск потери данных:
tmp=$(mktemp)
backup="${original}~"
modifyfile "$original" "$tmp"
cp -p "$original" "$backup"
cp -f "$tmp" "$original"
После нашего обсуждения первого ответа я предлагаю другой ответ:
TMP="$(mktemp "$original".XXXXXXXXXX)"
modifyfile "$original" "$TMP"
chmod --reference="$original" "$TMP"
chown --reference="$original" "$TMP"
mv -f "$TMP" "$original"
Комментарии:
$original
в mktemp
шаблон, чтобы гарантировать, что временный файл не помещается в /tmp
но в той же папке как $original
. Я верю этому если /tmp
смонтирован в другой файловой системе, операция больше не была бы атомарной.mktemp
теперь заключается в кавычки в случае, если это содержит пробел.$()
вместо, '' потому что я считаю это инструментом для очистки.ch{mod,own} --reference
используются для передачи полномочий $original
кому: $TMP
. Если у кого-то есть дополнительные идеи, какие метаданные могут и должны быть переданы, то отредактируйте мое сообщение и добавьте его.
rm "$TMP"
также, но это, кажется, делает, что я хочу. – Stephen Ostermiller 17.09.2013, 20:49mv
вместо этого. Я не вижу способ решить ту проблему. превосходный – strugee 17.09.2013, 21:45chown
только работы как корень.chmod
иchgrp
май или не может работать в зависимости от полномочий пользователя. Никакой копии другие атрибуты, такие как ACL или определенные для файловой системы расширенные атрибуты. – Gilles 'SO- stop being evil' 18.09.2013, 02:03