Как запустить программу для правильного чтения аргументов программы

У меня есть сценарий запуска, где команда, которую я пытаюсь запустить, является ошибкой (видимо, это не слово, это сейчас), жалуясь на неправильное использование.

Конкретная ошибка, которую я получаю, - это текст использования команды, сбрасываемый в системный журнал. Из этого я делаю вывод, что другая информация (путь к команде, время и т. Д.) В plist обрабатывается правильно, а не параметры команды.

После использования команды у меня есть одна последняя строка:

18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1

Но это просто означает, что «я вышел с ошибкой».

Я знаю, что launchdd распаковывает команду из своих опций, а на странице man сообщает вам о ProgramArguments: «... Обратите внимание: многие люди смущены этим ключом. Пожалуйста, внимательно прочитайте execvp (3)! .."

Хорошо, я прочитал execvp (3), и я не мудрее, поэтому я прошу вас прекрасную работу.

Как правило, запуск команды с терминала будет выглядеть так:

/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update

Это работает.

И вот как я разделил его в разделе Program /ProgramArguments моего планшета 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>

(для записи у меня изначально был путь к boinccmd \ escaped out, но это не работает, запуск удаляет пробелы в пути для вас)

Я попытался разделить аргументы дальше:

<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>

Но это тоже не сработало.

Как всегда, я очень уверен, что мне не хватает чего-то такого простого.

Спасибо.


Ответ:

Первой строкой ProgramArguments должен быть путь к программе. Это то, что меня сбило с толку и действительно, что, вероятно, означало «... Пожалуйста, внимательно прочитайте! ..» комментарий :) Я также обнаружил, что мне нужно разделить аргументы до их составных частей. Когда у меня было все, что на месте, все это работает. Большое вам спасибо.

<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>

Окончательное редактирование, чтобы сказать, для легкого понимания объяснений относительно того, ПОЧЕМУ это должно быть, см. объяснение SirPavlova.

~ Ш

13 голосов | спросил Woodgie 15 52013vEurope/Moscow11bEurope/MoscowFri, 15 Nov 2013 12:32:34 +0400 2013, 12:32:34

2 ответа


14

Ключ Program указывает файл для выполнения, & ключ ProgramArguments указывает аргументы, которые будут переданы процессу выполнения. Строго говоря, вы можете передать все аргументы, которые хотите обработать, но соглашение состоит в том, что первым должно быть имя, с помощью которого был вызван процесс, поэтому большинство программ игнорируют свой первый аргумент. Файл для выполнения, очевидно, необходима информация, но если отсутствует код Program, запускает он делает вид, что имеет то же значение, что и первый аргумент в ---- +: = 3 =: + ---- чисто как удобство .

В первом примере запускается boinccmd & дает ему аргументы, которые были бы эквивалентны команде терминала

ProgramArguments

, который сообщает boinccmd, что вы вызывали его как «--host localhost» & только передал ему два странных аргумента.

Ваш второй пример правильно отделяет аргументы, но, как предположил Эдди Келли, ему нужно встать спереди. Он сообщает boinccmd, что вы вызвали его как «-host», а затем передали еще шесть аргументов. boinccmd может распознать последние пять как два варианта, но не знает, что такое «localhost». Насколько boinccmd может сказать, он был вызван с терминала как

--host\ localhost --passwd\ gobbledygook --project\ http://setiathome.berkeley.edu/\ update

(обратите внимание на отсутствующий «-host»).

boinccmd, вероятно, является одним из подавляющего большинства программ, которые не заботятся о том, что их первый аргумент, поэтому вы, вероятно, могли бы просто перетащить /Library/Application\ Support/BOINC\ Data/boinccmd localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update во главе массива <string>HELLO</string>, но, вероятно, более чистое удаление ProgramArguments в целом & просто используйте это:

Program

Это может показаться бессмысленной избыточностью, но некоторые программы используют это для хорошего эффекта: bash et al. действуют как блоки входа, если их первый аргумент начинается с <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> , & Vim вводит различные режимы эмуляции, если первый аргумент - или ed вместо vi.

ответил SirPavlova 18 12013vEurope/Moscow11bEurope/MoscowMon, 18 Nov 2013 18:13:57 +0400 2013, 18:13:57
5

На основе man-страницы для exec (3) кажется, что первым аргументом программы должен быть путь к исполняемому файлу:

The execv(), execvp(), and execvP() functions provide an array of pointers to null-terminated strings
 that represent the argument list available to the new program.  The first argument, by convention,
 should point to the file name associated with the file being executed. The array of pointers must be
 terminated by a NULL pointer.

Если вы можете указать путь к исполняемому файлу в качестве аргумента в индексе 0, это может помочь ...

ответил Eddie Kelley 16 62013vEurope/Moscow11bEurope/MoscowSat, 16 Nov 2013 02:51:09 +0400 2013, 02:51:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132