Mam uruchomiony skrypt, w którym polecenie, które próbuję uruchomić, jest błędne (najwyraźniej to nie jest słowo, jest teraz), narzeka na niewłaściwe użycie.
Konkretny błąd, który otrzymuję, to tekst użycia polecenia zrzucony do dziennika systemu. Z tego wnioskuję, że inne informacje (ścieżka do polecenia, czas itp.) W liście są analizowane poprawnie, tylko nie opcje polecenia.
Po użyciu polecenia mam ostatnią linię:
18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1
Ale to po prostu oznacza „wyszedłem z błędem”.
Wiem, że uruchomione dzieli polecenie z jego opcji, a na stronie podręcznika mówi o ProgramArguments: „... Uwaga: wiele osób jest zdezorientowanych tym kluczem. Proszę bardzo uważnie przeczytać execvp (3)! ..”
No cóż, czytam execvp (3) i nie jestem mądrzejszy, więc proszę bardzo o cudowne pytania.
Zwykle uruchomienie polecenia z terminala wyglądałoby tak:
/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update
To działa na ucztę.
I w ten sposób podzieliłem go w sekcji Program / ProgramArguments mojej listy LaunchAgent:
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>--host localhost</string>
<string>--passwd gobbledygook</string>
<string>--project http://setiathome.berkeley.edu/ update</string>
</array>
(dla przypomnienia, pierwotnie miałem ścieżkę do boinccmd \ uciekł, ale to nie działa, uruchomiłem dla ciebie spacje na ścieżce)
Próbowałem dalej podzielić argumenty:
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>--host</string>
<string>localhost</string>
<string>--passwd</string>
<string>gobbledygook</string>
<string>--project</string>
<string>http://setiathome.berkeley.edu/</string>
<string>update</string>
</array>
Ale to też nie działało.
Jak zawsze jestem pewien, że brakuje mi czegoś tak prostego.
Dzięki.
ODPOWIEDŹ:
Pierwszy wiersz ProgramArguments musi być ścieżką do programu. Właśnie to mnie potknęło i to prawdopodobnie oznaczało komentarz „... Proszę bardzo uważnie przeczytać! ..” :) Stwierdziłem również, że musiałem podzielić argumenty na części składowe. Kiedy wszystko to miałam na swoim miejscu, to wszystko działa jak urok. Dziękuję Ci bardzo.
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<string>--host</string>
<string>localhost</string>
<string>--passwd</string>
<string>gobbledygook</string>
<string>--project</string>
<string>http://setiathome.berkeley.edu/</string>
<string>update</string>
</array>
Ostateczna edycja do łatwego zrozumienia wyjaśnienia, DLACZEGO to powinno być, zobacz wyjaśnienie SirPavlova.
~ W
<string>--host localhost</string>
pewno nie zadziała. Pamiętaj, że kiedy piszesz wiersz poleceń w powłoce, nie ma pojęcia, co jest częścią opcji i co to jest zwykły argument - po prostu dzieli się spacjami przed przekazaniem argumentów do uruchamianego programu. Może to również pomóc, jeśli chcesz pokazać dokładnieboinccmd
zgłaszany błąd .Odpowiedzi:
Do
Program
kluczowych Określa plik do wykonania, & theProgramArguments
key określa argumenty, które zostaną przekazane do procesu wykonującego. Ściśle mówiąc, możesz przekazać dowolne argumenty do procesu, ale konwencja jest taka, że pierwsza powinna być nazwą, pod którą wywołano proces, więc większość programów ignoruje swój pierwszy argument. ‡ Plik do wykonania jest oczywiście niezbędną informacją, ale jeśliProgram
brakuje klucza, uruchomienie udaje, że ma taką samą wartość jak pierwszy argumentProgramArguments
wyłącznie dla wygody .Twój pierwszy przykład zaczyna się od boinccmd i podaje mu argumenty, które byłyby równoważne poleceniu terminalu
co mówi boinccmd, że wywołałeś go jako „--host localhost” i przekazałeś mu tylko dwa dziwne argumenty.
Drugi przykład poprawnie rozdziela argumenty, ale jak sugerował Eddie Kelley, należy go wstawić z przodu. Mówi boinccmd, że wywołałeś go jako „--host”, a następnie przekazałeś kolejne sześć argumentów. boinccmd rozpoznaje ostatnie pięć jako dwie opcje, ale nie ma pojęcia o czym jest biznes „localhost”. O ile boinccmd może powiedzieć, został wywołany z terminala jako
(zwróć uwagę na brakujący „--host”).
boinccmd jest prawdopodobnie jednym z przeważającej większości programów, które nie dbają o to, jaki jest ich pierwszy argument, więc prawdopodobnie prawdopodobnie po prostu wepchniesz się
<string>HELLO</string>
na czołoProgramArguments
tablicy, ale prawdopodobnie łatwiej jest usunąćProgram
klucz i po prostu użyć tego:‡ Może to wydawać się pozbawioną znaczenia redundancją, ale niektóre programy wykorzystują to z dobrym skutkiem: bash i in. działają jako powłoki logowania, jeśli ich pierwszy argument zaczyna się od
-
, a Vim wchodzi w różne tryby emulacji, jeśli jego pierwszym argumentem jested
lubvi
zamiast niegovim
.źródło
Na podstawie strony podręcznika dla exec (3) wydaje się, że pierwszym argumentem programu powinna być ścieżka do pliku wykonywalnego:
Jeśli możesz podać ścieżkę do pliku wykonywalnego jako argument w indeksie 0, może to pomóc ...
źródło