linux - 启动停止守护进程引用的参数被误解

标签 linux shell debian

我一直在尝试使用 start-stop-daemon 制作一个初始化脚本。我被困在守护进程的论点上。我想将这些保留在脚本顶部的变量中,但我无法正确过滤引号。

我将在这里使用 ls,这样我们就不必查看大多数人不会知道或不关心的二进制文件和参数。

我正在寻找的最终结果是开始-停止...运行 ls -la "/folder with space/"

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

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

双重转义选项并尝试无数种报价变体都无济于事......然后他们最终进入守护进程,他们总是搞砸了。将 $DAEMON_OPTS 括在引号中会改变一切......然后他们被视为一个自引号以来......从来没有正确的数字:)

响应命令行(开始-停止...)将正确的内容打印到屏幕上。但是守护进程(真正的守护进程,不是 ls)提示参数数量错误。

如何指定一个变量,以便将其中的引号正确地传递给守护进程?

最佳答案

尝试

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

发生的情况是 DAEMON_OPTS 的外引号被剥离但内引号(单引号)保留。所以下一行将是:

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

这就是你想要的。

也可以通过转义达到相同的效果,但为此需要大量转义:首先,在赋值期间保护引号,然后在解析起始行和扩展变量时甚至一次或多或少。 :) bash -x 是你的 friend 。

[编辑] 上面的代码可以在除 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[@]}"

即将单词放入数组中。

关于linux - 启动停止守护进程引用的参数被误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1661193/

相关文章:

linux - 这个 shell 脚本有什么问题?

shell - AWK 脚本 shebang 允许以破折号为前缀的参数

linux - sudo 事件在哪里报告?

c++ - Boost:;program_options 1.49 - 无法与 -lboost_program_options 链接

linux - 使用 awk 在 Linux 中分割日期

linux - 转换MFC Doc/View到?

python - 无法打开sh文件

linux - shell 脚本 - 将一个变量分配给另一个 - 数组

debian - wkhtmltopdf 在没有 X-server 的 Debian 上非常慢

c# - 使用 docker 在 Linux 上运行 .net Framework 应用程序的最佳方式是什么