У меня почти найдено решение:
Анализ
Когда запущен помощник, например, из launchd
или через AuthorizationExecuteWithPrivileges
(под macOS 10.15), он может работать от имени пользователя root, не имея сведений о вошедшем в систему пользователе, поэтому он не может определить папку корзины пользователя.
Как ни странно, переменные окружения (см. man env
) могут даже отображать текущийимя пользователя и домашний каталог, но реальный идентификатор пользователя , который можно запросить с помощью getuid()
, вернет 0 (root), что также приведет к NSUserName()
и NSHomeDirectory()
, возвращающему информацию пользователя root,И, похоже, что trashItemAtURL
и связанные функции полагаются на NSHomeDirectory()
для определения местоположения папки «Корзина».
Полуфабрикаты
К счастью, есть способ изменить реальный идентификатор пользователя , с setreuid
.
Поэтому в моем тестировании, когда я звоню setreuid (501, 0)
(501 - это идентификатор пользователя, вошедшего в систему), тогда trashItemAtURL
действительно перемещаетсяфайл в папку «Корзина» пользователя, действительно, вместе с автоматическим переименованием, где это необходимо.
Однако, это не заставляет Put Back работать так, как было быпри удалении того же файла с помощью Finder.
Как заставить Put Back работать
Похоже, причина того, что Put Back не работает, связана с более глубокой проблемой:давняя ошибка в среде macOS, см. этот отчет об ошибках .
Что в основном означает: это лучшее, что мы можем из него исправить, пока Apple не исправит основную ошибку.
Единственная работающая альтернатива, чтобы сделать Вернуть Работа заключается в том, чтобы попросить Finder уничтожить элементы с помощью AppleEvents / AppleScript.