Несколько sudo -S в одной команде проблема

  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
14.11.2021, 18:24
1 ответ

Я не могу ввести пароль вручную, потому что этот образ с Linux и Heroku работает в контейнере Docker.Спасибо за любой ответ, но мне нужно было найти решение самостоятельно. Вот мой измененный код:

RUN echo "password" | sudo -S curl https://cli-assets.heroku.com/install.sh -o ~/heroku.sh
RUN echo "password" | sudo -S sh ~/heroku.sh`

Вроде работает...

-2
14.11.2021, 22:48

Теги

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