Это не работает, поскольку переменная оболочки installed
— это две разные переменные в функции progressbar
(в ее окружении подоболочки )и в функции installplugin
. Функция progressbar
выполняется в подоболочке, поскольку вы запускаете ее как фоновую задачу. Он унаследует значение от своей родительской среды при запуске функции, но родитель не сможет установить новое значение в дочерней среде (подоболочке progressbar
).
Это по-прежнему использует progressbar
в качестве фоновой задачи, но позволяет установить ловушку для выхода из бесконечного цикла. Основная функция, foo
, запускает ловушку, посылая ей соответствующий сигнал, когда это делается.
progressbar () {
trap 'break' USR1
while printf '.' >&2; do
sleep 0.25
done
}
foo () {
progressbar & pid="$!"
echo 'working...'
sleep 5
echo 'done.'
kill -s USR1 "$pid"
}
foo
Вы не используете -numeric-ids
и/или -fake-super
для резервного копирования (и восстановления ). Если вы немного измените команду rsync
, вы получите правильное сохранение и восстановление отображений.
В этих примерах -M
указывает rsync
применить следующую опцию, т. е. подделку, на удаленной стороне соединения. Дополнительным побочным эффектом является то, что вам не нужна удаленная сторона (, где хранятся резервные копии ), для запуска от имени пользователя root
Резервные копии передаются с клиента на сервер резервных копий.
sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --numeric-ids -M--fake-super --exclude-from="${exc_path}" "${src_path}" "${dst_addr}:${dst_path}"
Это приведет к извлечению резервных копий из клиента (, т. е. восстановлению )
.sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --numeric-ids -M--fake-super --exclude-from="${exc_path}" "${dst_addr}:${dst_path}" "${src_path}"
И это, запущенное на сервере резервных копий, передаст резервные копии клиенту (, т.е. восстановит)
sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --numeric-ids --fake-super "${dst_path}" "${src_host}:${src_path}"
Каждый файл хранит информацию о своем владельце индивидуально, нет структуры данных для индексации файлов на основе их владельцев. Итак, что бы вы ни делали, вам придется охотиться за файлами и менять UID для каждого из них по отдельности. К счастью, это не очень сложно сделать; это должно сделать:
find "$dir" -user olduser -exec chown newuser {} +
Конечно, было бы лучше изменить систему резервного копирования для хранения (и восстановления )правильных UID, особенно если вы могли создавать резервные копии файлов, принадлежащих нескольким пользователям.