start-stop-daemon引用的参数被误解了

时间:2009-11-02 13:04:00

标签: linux shell debian

我一直在尝试使用start-stop-daemon创建一个init脚本。我被困在守护进程的参数上。我想将这些保存在脚本顶部的变量中,但我无法正确过滤掉报价。

我会在这里使用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 个答案:

答案 0 :(得分:14)

尝试

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

发生的事情是DAEMON_OPTS的外部引号被剥离但内部(单引号)仍然存在。所以下一行将是:

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

这就是你想要的。

也可以通过转义实现相同的效果但是你需要大量的转义:首先,在分配期间保护引号,然后在解析起始行并扩展变量甚至一次时保护引号或多或少。 :) bash -x是你这样的朋友。

[编辑]上面的代码可以在除了Linux之外的任何东西上使用Bourne和Korn shell。在Linux上,使用kshbash,shell会添加额外的引号,这会搞乱整个事情:

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

即。将单词放入数组中。

答案 1 :(得分:8)

我以为我会发布我的工作初始化脚本中使用的最终引用:

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 :(得分:1)

每当你有一个带空格的bash变量时,请确保在引用它时使用引号。

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

答案 3 :(得分:0)

你是否试过用引号反过来做?像这样:

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

我不确定,但那可能有用吗?

(如果只有我有足够的声誉,我会将此作为对前一个答案的评论发布。)