Wenn ich versuche, eine LaunchAgent-Liste von zu laden, launchctl
kann ich nicht herausfinden, wie ein Skript im Ausgangsverzeichnis ausgeführt wird .
Mein Code ist:
<?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>
Ich habe sowohl mit als auch ohne Bash versucht und auch ~
mit ersetzt $HOME
. Ich habe es auch versucht, bash -c
ohne dass es funktioniert.
Der Fehlercode lautet:
`com.tyilo.test: bash: ~/script.sh: No such file or directory`
Antworten:
EnableGlobbing
Aktiviert die Tilde- und Wildcard-Erweiterung fürProgramArguments
:Dies hat keine Auswirkung auf
Program
oderWatchPaths
, jedoch funktioniert die Tilde-ErweiterungWatchPaths
standardmäßig.quelle
Mac OS X 10.10+
) entfernt.EnableGlobbing funktioniert unter OS X Yosemite 10.10 nicht . Es wurde veraltet ( ref ).
Sie können in Protokollen sehen
The EnableGlobbing key is no longer respected. Please remove it.
(von/var/log/system.log
)Das Problem ist, dass
launchd
cwd (aktuelles Arbeitsverzeichnis) ist/
, so dass Sie es nicht verwenden können,./
wie einige Leute sagten.Um ein Skript von zu Hause aus auszuführen, verwenden Sie einfach
(bash|zsh|sh)
-c
. Möglichkeit. Auf diese Weise können Sie die Tilde~
oder die$HOME
Variable verwenden.quelle
sh
. Wenn Bash as beteiligt istsh
, wird es im POSIX-Kompatibilitätsmodus ausgeführt, der viele Bash-Erweiterungen deaktiviert.~/
verschlingt also nicht unterstützt. Sie können./
stattdessen verwenden, solange der Dämon in der Heimbibliothek des Benutzers gespeichert ist. (~/Library/LaunchAgents
)Das zuverlässigste, was ich dabei gefunden habe, war die Verwendung von
sh
und derHOME
Umgebungsvariablen:Hinweis: Die Anführungszeichen sind erforderlich.
quelle
Es wäre hilfreich zu wissen, warum das Skript aus dem Ausgangsverzeichnis des Benutzers ausgeführt werden muss. Wenn Sie den Kurznamen des Benutzers für das Skript benötigen, können Sie ihn abrufen, indem Sie ihn einer Variablen wie in zuweisen
Dann
$user
im Skript verwenden.Ich würde das Skript wirklich an einem anderen Ort als in einem Home-Verzeichnis ablegen, auf das andere Benutzer auf demselben Computer zugreifen können. Sie können das freigegebene Verzeichnis verwenden oder das Skript in / Library / Scripts / ablegen.
Sie müssen den vollständigen Pfad für die launchd-Liste verwenden. Außerdem müssen Sie in Ihrer launchd plist keine Angaben machen,
<string>bash</string>
da Sie den shebang im Skript haben sollten und er ausführbar sein sollte.quelle
bash
als tatsächlich auszuführenden Befehl ist ein guter Fallback ohne wirklichen Schaden. Wenn er nicht über den Shebang verfügt oder vergisst, das Skript ausführbar zu machen (o = rwx), ruft bash das Skript trotzdem auf / führt es aus.Ist es ausführbar?
chmod 700 ~/script.sh
im Terminal. Außerdem würde ich nicht $ HOME oder ~ verwenden, sondern den tatsächlichen Pfad zur Datei.
quelle
Wenn Ihr Skript ein Benutzeragent ist (und sich daher in der Bibliothek des Basisordners befindet),
launchd
ist das aktuelle Arbeitsverzeichnis der Basisordner. UNIX verweist auf das Basisverzeichnis mit einem Punkt im Pfad.Verwenden Sie also im Grunde genommen
./script.sh
statt~/script.sh
. ;-)quelle
/
nicht '~'.~/Library/LaunchAgents
mit den Argumenten:sh
,-c
,echo $HOME > /Users/Tyilo/launchd_home.txt
. Wann lief die Datei/Users/Tyilo/launchd_home.txt
enthalten/
, nicht/Users/Tyilo
.