По сути, ваша проблема заключается в Почему мой shell-скрипт захлебывается на пробелах или других специальных символах?
Когда вы пишете $curl_command
вне кавычек, это берет значение переменной curl_command
и разбивает его на отдельные слова в каждой последовательности пробелов. (Затем каждое слово интерпретируется как шаблон подстановочного знака и заменяется списком подходящих имен файлов, если есть подходящие имена файлов, но в вашем случае подстановочных знаков нет, поэтому этот шаг ничего не меняет).
Кавычки являются частью синтаксиса оболочки. На них не влияет расширение переменных без кавычек. Поэтому команда $curl_command
выполняет curl
с аргументами -g
, -x
, ""
и -k
.
Вы пытаетесь запихнуть список строк (аргументов команды) в строку. Это плохо работает. На самом деле, вы получите пустое слово.
Надежным решением является использование переменной типа list of strings для хранения списка строк. В оболочке это называется массивом. Bash, ksh и zsh поддерживают массивы:
curl_command=(curl -g -x "" -k)
…
"${curl_command[@]}" http://www.example.com/rest/v1/blah
Переменная curl_command
содержит массив из 5 элементов, элементами которого являются curl
, -g
, -x
, пустая строка и -k
.
Если вам нужен обычный сценарий sh, вы можете использовать позиционные параметры, предполагая, что они больше ни для чего не нужны.
set -- curl -g -x "" -k
…
"$@" http://www.example.com/rest/v1/blah
Другой возможностью может быть использование функции для инкапсуляции кода, который вы хотите использовать несколько раз.
curl_command () {
curl -g -x "" -k "$@"
}
…
curl_command http://www.example.com/rest/v1/blah
Загрузите работающий Linux (, например. установка Linux Mint с USB-накопителя ), смонтируйте корневой раздел с внутреннего диска, найдите и исправьте/отключите фиктивный скрипт.
Прежде всего, вы должны войти в однопользовательский режим и перемонтировать необходимые разделы с опцией rw
.
Прерывание процесса загрузки для доступа к меню GRUB. Для этого нажмите любую клавишу, когда отображается «Загрузка в.... в X» .
Войдите в режим редактирования вашего последнего ядра (или того, которое вы используете по умолчанию ), и отредактируйте строку, начинающуюся с linux /boot/vm* <..> ro quiet splash
, и добавьте init=/bin/bash
в конец.
Нажмите F10
для сохранения и нажмите b
для загрузки с новой опцией.
Это загрузит вас в корневую оболочку (у вас не будет графического интерфейса ). Теперь перемонтируйте root как файловую систему, доступную для записи.
mount -o rw,remount /
Выберите один:
+-Исследуйте проблему непосредственно в однопользовательском режиме.
Найдите сломанный скрипт в /etc/profile
, /home/guest/.bashrc
или любом другом файле конфигурации, полученном в процессе входа в систему.
+-Отключить автоматический вход гостя в систему по умолчанию.
Измените строку autologin-user=user
в /etc/lightdm/lightdm.conf
на autologin-user=
.
Перемонтируйте корневую файловую систему в режим ro
с помощью mount -o ro,remount /
.
Выполните /sbin/init
, чтобы продолжить процесс загрузки, или нажмите CTRL+d
, чтобы перезагрузить машину.
В зависимости от того, какой путь вы выбрали, вы сможете войти в систему либо как гость (, если останавливающий скрипт был исключен из автоматического выполнения при входе в систему ), либо как ваш пользователь с привилегиями root (, если гость был исключен из процесса автологина ).