Подтвердить что ты не робот

Start-stop-daemon цитируемые аргументы неверно истолкованы

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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\""

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

Ответ 2

Try

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[@]}"

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

Ответ 3

Вы пробовали делать это с кавычками? Вот так:

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

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

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

Ответ 4

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

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