Kiedy próbuję załadować listę LaunchAgent z, launchctl
nie mogę dowiedzieć się, jak uruchomić skrypt w katalogu domowym.
Mój kod to:
<?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>
Próbowałem zarówno z jak i bez bash, a także wymianie ~
z $HOME
. Próbowałem też używać bash -c
bez tego.
Kod błędu to:
`com.tyilo.test: bash: ~/script.sh: No such file or directory`
Odpowiedzi:
EnableGlobbing
umożliwia rozszerzenie tyldy i symboli wieloznacznych dlaProgramArguments
:To nie ma wpływu
Program
lubWatchPaths
jednak tyldy działaWatchPaths
domyślnie.źródło
Mac OS X 10.10+
).EnableGlobbing nie działa w systemie OS X Yosemite 10.10 . To jest przestarzałe ( ref ).
Możesz zobaczyć w logach
The EnableGlobbing key is no longer respected. Please remove it.
(od/var/log/system.log
)Problem polega na tym, że
launchd
cwd (bieżący katalog roboczy) jest/
, więc nie możesz używać,./
jak niektórzy mówią.Aby uruchomić skrypt z domu, najprostszym sposobem jest użycie
(bash|zsh|sh)
-c
. opcja. W ten sposób będziesz mieć możliwość użycia tyldy~
lub$HOME
zmiennej.źródło
sh
; gdy Bash jest zaangażowany jakosh
, działa w trybie zgodności z POSIX, który wyłącza wiele rozszerzeń Bash.~/
jest pożeraniem, więc nie jest obsługiwane. Możesz użyć./
zamiast tego, dopóki demon jest zapisany w domowej bibliotece użytkowników. (~/Library/LaunchAgents
)Najbardziej niezawodny znalazłem robi to był za pomocą
sh
aHOME
zmiennej środowiska spowodowanego:Uwaga: cytaty są wymagane.
źródło
Pomocne byłoby wiedzieć, dlaczego skrypt musi być uruchamiany z katalogu domowego użytkownika. Jeśli potrzebujesz skróconej nazwy użytkownika dla skryptu, możesz ją zdobyć, przypisując ją do zmiennej jak w
Następnie użyj
$user
w skrypcie.Naprawdę umieściłbym skrypt w innym miejscu niż katalog domowy, a następnie byłby dostępny dla innych użytkowników na tym samym komputerze. Możesz użyć katalogu współdzielonego lub umieścić skrypt w / Library / Scripts /
Będziesz musiał użyć pełnej ścieżki do uruchomionego plist. Ponadto w uruchomionej liście nie musisz określać,
<string>bash</string>
ponieważ powinieneś mieć shebang w skrypcie i powinien on być wykonywalny.źródło
bash
rzeczywistego polecenia do wykonania jest dobrą rezerwą bez rzeczywistej szkody. Jeśli nie ma shebang lub zapomni, aby skrypt był wykonywalny (o = rwx), wtedy bash będzie nadal wywoływał / wykonywał skrypt.Czy to jest wykonywalne?
chmod 700 ~/script.sh
w terminalu. Ponadto nie użyłbym $ HOME lub ~, ale raczej rzeczywistą ścieżkę do pliku.
źródło
Jeśli skrypt jest agentem użytkownika (a zatem znajduje się w bibliotece folderu domowego),
launchd
bieżącym katalogiem roboczym jest folder domowy. UNIX odnosi się do katalogu domowego z kropką w ścieżce.Zasadniczo używaj
./script.sh
zamiast~/script.sh
. ;-)źródło
/
, a nie „~”.~/Library/LaunchAgents
z argumentami:sh
,-c
,echo $HOME > /Users/Tyilo/launchd_home.txt
. Kiedy prowadził plik/Users/Tyilo/launchd_home.txt
zawierał/
nie/Users/Tyilo
.