Вам нужны пробелы до и после == в ваших [[... ]] тестах, иначе они просто оцениваются как строки, а не -пусто всегда верно.
Например:
$ 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
В вашем скрипте также есть несколько мест, где $
перед переменной отсутствует. например.
if [[ $instruction=="restart" || instruction=="unload" ]]
Для этого нужны пробелы до и после==
и a $
перед вторымinstruction
:
if [[ $instruction == "restart" || $instruction == "unload" ]]
Здесь же:
if [[ instruction=="restart" ]]
Так и должно быть:
if [[ $instruction == "restart" ]]
При их использовании необходимо заключать в двойные кавычки -переменные (и позиционные параметры оболочки ). например.
local lineno="$1"
local msg="$2"
и:
instruction="$1"
filepath="$2"
и:
launchctl stop "$filepath"
launchctl unload "$filepath"
Зачем писать это как функцию, а не как -отдельный скрипт? Вам это нужно, чтобы изменить текущую среду оболочки?
Нет ничего плохого в написании функций, но если вы не хотите изменить текущую среду оболочки, вам лучше использовать изоляцию, обеспечиваемую отдельным скриптом, чтобы случайно не изменить среду..
Или объявите все переменные вашей функции (, вкл. $instruction
и$filepath
)как local
, но это хорошо только для защиты от изменений переменных, функция может изменить другие вещи, например текущий каталог оболочки.
Я не могу ввести пароль вручную, потому что этот образ с 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`
Вроде работает...