аргументы в кавычках start-stop-daemon неверно истолкованы - PullRequest
20 голосов
/ 02 ноября 2009

Я пытался создать сценарий инициализации, используя start-stop-daemon. Я застрял на аргументах к демону. Я хочу сохранить их в переменной в верхней части скрипта, но не могу правильно отфильтровать цитаты.

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

Конечный результат, который я ищу, для запуска-остановки ... для запуска ls -la "/ папка с пробелом /"

DAEMON=/usr/bin/ls 
DAEMON_OPTS='-la "/folder with space/"'

start-stop-daemon --start --make-pidfile --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS

Двойное экранирование опций и попытка неисчислимых вариаций цитат не помогают ... Тогда они оказываются в демоне, который они всегда испортили. Заключение в кавычки $ DAEMON_OPTS меняет положение вещей ... тогда они рассматриваются как единое целое, так как в кавычках ... никогда не бывает нужного числа:)

Вывод командной строки (start-stop ...) выводит на экран правильные элементы. Но демон (настоящий, а не ls) жалуется на неправильное количество аргументов.

Как указать переменную, чтобы внутри нее правильно выводились кавычки?

Ответы [ 4 ]

14 голосов
/ 02 ноября 2009

Попробуйте

DAEMON_OPTS="-la '/folder with space/'"
start-stop-daemon --start ... -- $DAEMON_OPTS

Что происходит, так это то, что внешние кавычки DAEMON_OPTS удаляются, а внутренние (одинарные кавычки) остаются. Поэтому следующая строка будет читать:

start-stop-daemon --start ... -- -la '/folder with space/'

что ты и хочешь.

Также возможно достичь того же эффекта с помощью экранирования, но для этого нужно много экранировок: сначала, чтобы защитить кавычки во время присваивания, затем позже, когда начальная строка анализируется и переменные раскрываются и, возможно, даже один раз. более менее. :) bash -x твой друг для таких вещей.

[EDIT] Приведенный выше код работает с оболочкой Bourne и Korn на любом компьютере, кроме Linux. В Linux, с ksh или bash, оболочка добавит дополнительные кавычки, которые запутают все:

FOLDER="/folder with space/"
DAEMON_OPTS="-la $FOLDER"
start-stop-daemon --start ... -- $DAEMON_OPTS

Если вы запустите его с -x, вы увидите:

FOLDER='/folder with space/'
DAEMON_OPTS='-la ~/folder with space/'
ls -la '~/folder' with space/

Таким образом, только первое слово получает защиту (вероятно, потому что оно содержит специальный символ). Если я добавлю одинарные кавычки вокруг $FOLDER, я получу:

FOLDER='/folder with space/'
DAEMON_OPTS='-la '\''~/folder with space/'\'''
ls -la ''\''~/folder' with 'space/'\'''

Молодец. Обходной путь: Разделите параметры на две переменные: одна с параметрами, а другая с путем:

start-stop-daemon --start ... -- $DAEMON_OPTS "$DAEMON_PATH"

[EDIT2] Это тоже работает:

FOLDER="$HOME/folder with space/"
opt[0]=-la
opt[1]=$FOLDER
ls "${opt[@]}"

т.е. поместите слова в массив.

8 голосов
/ 26 марта 2010

Я решил опубликовать последние цитаты, использованные в моем рабочем скрипте инициализации:

COMMAND="/path/to/script -opt param param2 param3"
DAEMON_OPTS=" 0.0.0.0:$PORT -dest $OUTPUT_DIRECTORY -command"

start-stop-daemon --start --background --make-pidfile --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS "\"$COMMAND\""

Очевидно, неполный и нефункциональный пример, но я надеюсь, что вы поняли его суть. Двойные кавычки с внутренней парой, которой удалось избежать, - вот что сработало.

1 голос
/ 05 августа 2013

Всякий раз, когда у вас есть переменная bash с пробелами, обязательно используйте кавычки при обращении к ней.

start-stop-daemon --start --make-pidfile --pidfile $ PID --exec $ DAEMON - "$ DAEMON_OPTS"

0 голосов
/ 02 ноября 2009

Вы пытались сделать это наоборот с цитатами? Как это:

DAEMON_OPTS='-la "/folder with space/"'

Я не уверен, но это может сработать?

(я бы опубликовал это в качестве комментария к предыдущему ответу, если бы только у меня было достаточно репутации для этого).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...