Quando tento carregar um plist do LaunchAgent, launchctl
não consigo descobrir como executar um script no diretório inicial.
Meu código é:
<?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>
Eu tentei com e sem bash e também substituindo ~
por $HOME
. Eu também tentei usar bash -c
sem ele funcionar.
O código de erro é:
`com.tyilo.test: bash: ~/script.sh: No such file or directory`
Respostas:
EnableGlobbing
permite expansão til e curinga paraProgramArguments
:Não afeta
Program
ouWatchPaths
, no entanto, a expansão til funcionaWatchPaths
por padrão.fonte
Mac OS X 10.10+
).EnableGlobbing não funciona no OS X Yosemite 10.10 . Foi preterido ( ref ).
Você pode ver nos logs
The EnableGlobbing key is no longer respected. Please remove it.
(de/var/log/system.log
)O problema é que o
launchd
cwd (diretório de trabalho atual) é/
, então você não pode usar./
como algumas pessoas disseram.Para executar um script em sua casa, a maneira mais simples é usar
(bash|zsh|sh)
-c
. opção. Dessa forma, você poderá usar o til~
ou a$HOME
variável.fonte
sh
; quando o Bash está envolvidosh
, ele é executado no modo de compatibilidade POSIX, que desativa muitas extensões do Bash.~/
está devorando, então não é suportado. Você pode usar./
, desde que o daemon seja salvo na biblioteca inicial do usuário. (~/Library/LaunchAgents
)O mais confiável que encontrei ao fazer isso foi usar
sh
aHOME
variável de ambiente:Nota: as cotações são obrigatórias.
fonte
Seria útil saber por que o script precisa ser executado no diretório inicial do usuário. Se você precisar do nome abreviado do usuário para o script, poderá obtê-lo atribuindo-o a uma variável como em
Em seguida, use
$user
no script.Eu realmente colocaria o script em outro lugar que não seja um diretório pessoal, para que ele possa ser acessado por outros usuários no mesmo computador. Você pode usar o diretório compartilhado ou colocar o script em / Library / Scripts /
Você precisará usar o caminho completo para a lista de inicialização. Além disso, no seu launchd plist, você não precisará especificar
<string>bash</string>
como deve ter o shebang no script e deve ser executável.fonte
bash
como o comando realmente a ser executado é um bom retorno, sem prejuízo real. Se ele não possui o shebang ou se esquece de tornar o script executável (o = rwx), o bash ainda invocará / executará o script.É executável?
chmod 700 ~/script.sh
no terminal. Além disso, eu não usaria $ HOME ou ~, mas o caminho real para o arquivo.
fonte
Se o seu script for um agente de usuário (e, portanto, localizado na biblioteca da pasta base),
launchd
o diretório de trabalho atual é a pasta base. UNIX refere-se ao diretório inicial com um ponto no caminho.Então, basicamente, use em
./script.sh
vez de~/script.sh
. ;-)fonte
/
, na verdade , não '~'.~/Library/LaunchAgents
com os argumentos:sh
,-c
,echo $HOME > /Users/Tyilo/launchd_home.txt
. Quando executou o arquivo/Users/Tyilo/launchd_home.txt
contido/
, não/Users/Tyilo
.