CWD и строка пути к файлу автоматически объединяются в вызовах launchctl

Не совсем ответ, но :Вы можете использовать внешний форматтер :«Правка» > «Формат» > «Отправить выделение» > «Установить пользовательскую команду» как питон -м json.tool

идея украдена у

0
08.09.2019, 01:38
2 ответа

Большое спасибо Касу за его ответ и помощь с синтаксисом bash, но я обнаружил, что из-за некоторой возни,тильдав ~/Library/LaunchAgents/[agent]является причиной проблемы в том, чтобы заставить скрипт работать так, как задумано. и не выбрасывать составной путь.

По какой-то причине тильда не раскрывается в параметре адреса launchctl, поэтому, если у кого-то еще возникла эта проблема, используйте:

$HOME/Library/LaunchAgents/[agent]

для обращения к вашему агенту в команде launchctl.

Этот путь описан здесь в разделе «устаревшие команды», затем «загрузить»

N.B:для моего скрипта, по крайней мере, это на самом деле не устраняет ошибки генерирования launchctl, но исправляет функциональность. Несмотря на то, что в документации говорится:

Due to bugs in the previous implementation and long-stand- ing client expectations around those bugs, the load and unload subcommands will only return a non-zero exit code due to improper usage. Otherwise, zero is always returned.

.. ловушка ERR, которую я настроил, постоянно выдает ошибки без сообщения, даже если сценарий работает по назначению, а репликация команд вручную не выдает никаких сообщений об ошибках.

Возможно, кто-то сможет исправить мое невежество, но если вы все еще -чешете голову после моего предложения, попробуйте launchctl list | grep [agent_name]посмотреть, добились ли вы ожидаемого эффекта

1
28.01.2020, 02:29
  1. Вам нужны пробелы до и после == в ваших [[... ]] тестах, иначе они просто оцениваются как строки, а не -пусто всегда верно.

    Например:

    $ instruction=whatever
    $ [[ $instruction=="restart" ]] && echo true || echo false
    true
    

    Это эквивалентно:

    $ [[ whatever=="restart" ]] && echo true || echo false
    true
    

    Это также эквивалентно следующему (и нескольким другим вариантам):

    $ [[ -n 'whatever=="restart"' ]] && echo true || echo false
    true
    

    Во всех этих случаях вы не проверяете, равно ли $instruction«перезагрузке». Вместо этого вы проверяете, является ли строка whatever=="restart"не пустой -. Строка содержит последовательность символов ==, но это не имеет значения.Встроенные в строку, они представляют собой просто символы без особого значения.

    Сравните с:

    $ instruction=whatever
    $ [[ $instruction == "restart" ]] && echo true || echo false
    false
    $ instruction=restart
    $ [[ $instruction == "restart" ]] && echo true || echo false
    true
    

  1. В вашем скрипте также есть несколько мест, где $перед переменной отсутствует. например.

    if [[ $instruction=="restart" || instruction=="unload" ]]
    

    Для этого нужны пробелы до и после==и a $перед вторымinstruction:

    if [[ $instruction == "restart" || $instruction == "unload" ]]
    

    Здесь же:

    if [[ instruction=="restart" ]]
    

    Так и должно быть:

    if [[ $instruction == "restart" ]]
    

  1. При их использовании необходимо заключать в двойные кавычки -переменные (и позиционные параметры оболочки ). например.

    local lineno="$1"
    local msg="$2"
    

    и:

    instruction="$1"
    filepath="$2"
    

    и:

    launchctl stop "$filepath"
    launchctl unload "$filepath"
    

  1. Зачем писать это как функцию, а не как -отдельный скрипт? Вам это нужно, чтобы изменить текущую среду оболочки?

    Нет ничего плохого в написании функций, но если вы не хотите изменить текущую среду оболочки, вам лучше использовать изоляцию, обеспечиваемую отдельным скриптом, чтобы случайно не изменить среду..

    Или объявите все переменные вашей функции (, вкл. $instructionи$filepath)как local, но это хорошо только для защиты от изменений переменных, функция может изменить другие вещи, например текущий каталог оболочки.

1
28.01.2020, 02:29

Теги

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