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) жалуется на неправильное количество аргументов.
Как указать переменную, чтобы кавычки внутри нее были правильно доставлены к демону?
Ответы
Ответ 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"