Попробуйте
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[@]}"
т.е. поместите слова в массив.