#bash #macos #shell
#bash #macos #оболочка
Вопрос:
Из-за маленького диска у меня есть внешний SSD-накопитель USB-C, куда я хочу перенести некоторые программные проекты, над которыми в настоящее время не работаю. Чтобы просмотреть переданные на аутсорсинг проекты в моем каталоге проектов по умолчанию в finder и терминале, я подумал о символической привязке внешних проектов к моей папке по умолчанию. Я попытался использовать fswatch для обнаружения изменений и автоматической символической ссылки на новые папки.
# watchExternalProjects.sh
fswatch -o /Volumes/SSD/Projects/ | xargs -n1 -I{} ./createSymlinks.sh
# createSymlinks.sh
cd ~/Projects amp;amp; find -L . -name . -o -type d -prune -o -type l -exec rm {}
ln -s /Volumes/SSD/Projects/* ~/Projects/ 2> /dev/null
Это работает, но теперь я хочу автоматически запускать этот скрипт при входе в систему. Я попытался создать приложение Automator, которое вызывает скрипт и помещает его в элементы входа в систему, но наблюдатель не остается активным, а запускается только один раз при входе в систему, и дальнейшие изменения не обнаружены.
Я также попытался настроить агент запуска:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.loginscript</string>
<key>ProgramArguments</key>
<array>
<string>~/Documents/Files/watchExternalProjects.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Похоже, это не работает.
Есть идеи?
Редактировать:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.loginscript</string>
<key>ProgramArguments</key>
<array>
<string>/Users/user/Documents/Files/watchExternalProjects.sh</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/Users/user</string>
<key>UserName</key>
<string>user</string>
<key>StandardOutPath</key>
<string>/tmp/com.user.loginscript.stdout</string>
<key>StandardErrorPath</key>
<string>/tmp/com.user.loginscript.stderr</string>
</dict>
</plist>
Кажется, это работает, возможно, первый тоже сработал. Но теперь я могу отследить его до ошибки «Операция не разрешена», зарегистрированной в com.user.loginscript.stderr
Комментарии:
1. Я бы рекомендовал задать этот вопрос также в Ask Different apple.stackexchange.com
2. Разве вам не нужно просто выполнить фоновую задачу, добавив
amp;
в watchExternalProjects.sh ? Я предполагаю, что он завершает процесс fswatch после завершения родительского процесса.3. @bobdylan Я уже пробовал это с Automator. Не уверен, как это сделать в агенте запуска.
4. Почему бы просто не настроить это как системную службу вместо этого?
5. Насколько я знаю, существует два подхода к написанию системных служб на Mac: Automator и Launch Agent. Последний был бы эквивалентен Linux systemctl на Mac launchctl. Или я что-то пропустил?