Когда я пытаюсь загрузить список запуска LaunchAgent, launchctl
я не могу узнать, как запустить скрипт в домашнем каталоге.
Мой код:
<?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>ProgramArguments</key>
<array>
<string>bash</string>
<string>~/script.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>Label</key>
<string>com.tyilo.test</string>
</dict>
</plist>
Я пробовал как с и без Баш, а также заменить ~
на $HOME
. Я также пытался использовать bash -c
без него работает.
Код ошибки:
`com.tyilo.test: bash: ~/script.sh: No such file or directory`
Ответы:
EnableGlobbing
включает расширение тильды и подстановочных знаков дляProgramArguments
:Это не влияет
Program
илиWatchPaths
, однако, расширение тильды работаетWatchPaths
по умолчанию.источник
Mac OS X 10.10+
).EnableGlobbing не работает на OS X Yosemite 10.10 . Это устарело ( ref ).
Вы можете увидеть в журналах
The EnableGlobbing key is no longer respected. Please remove it.
(с/var/log/system.log
)Проблема в том, что
launchd
cwd (текущий рабочий каталог) есть/
, поэтому вы не можете использовать,./
как говорили некоторые люди.Для запуска сценария из вашего дома простой способ заключается в использовании
(bash|zsh|sh)
-c
. вариант. Таким образом, у вас будет возможность использовать тильду~
или$HOME
переменную.источник
sh
; когда Bash задействован какsh
, он работает в режиме совместимости с POSIX, который отключает многие расширения Bash.~/
жадно так не поддерживается. Вы можете использовать./
вместо этого, пока демон сохраняется в домашней библиотеке пользователей. (~/Library/LaunchAgents
)Самый надежный я нашел делать это с помощью
sh
и сHOME
переменной Enviroment:Примечание: цитаты обязательны.
источник
Было бы полезно узнать, почему скрипт должен запускаться из домашнего каталога пользователя. Если вам нужно короткое имя пользователя для скрипта, вы можете получить его, присвоив его переменной, как в
Затем используйте
$user
в сценарии.Я бы действительно поставил скрипт где-то, кроме домашней директории, тогда он будет доступен другим пользователям на том же компьютере. Вы можете использовать общий каталог или поместить скрипт в / Library / Scripts /
Вы должны будете использовать полный путь к списку запусков. Кроме того, в вашем файле launchd plist вам не нужно указывать,
<string>bash</string>
поскольку у вас должен быть шебанг в скрипте, и он должен быть исполняемым.источник
bash
в качестве фактической команды для выполнения является хорошим запасным вариантом без реального ущерба. Если у него нет шебанга или он забывает сделать скрипт исполняемым (o = rwx), то bash все равно вызовет / выполнит скрипт.Если ваш сценарий является агентом пользователя (и, следовательно, находится в библиотеке домашней папки),
launchd
текущим рабочим каталогом является домашняя папка. UNIX относится к домашнему каталогу с точкой в пути.Так что в основном используйте
./script.sh
вместо~/script.sh
. ;-)источник
/
не '~'.~/Library/LaunchAgents
с аргументами:sh
,-c
,echo $HOME > /Users/Tyilo/launchd_home.txt
. Когда запускается файл,/Users/Tyilo/launchd_home.txt
содержащийся/
, нет/Users/Tyilo
.Это исполняемый файл?
chmod 700 ~/script.sh
в Терминале. Кроме того, я бы не использовал $ HOME или ~, а скорее фактический путь к файлу.
источник