Mar*_*tin 21 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
Run Code Online (Sandbox Code Playgroud)
双重逃避选项并尝试无数的引用变化无济于事......然后他们最终在守护进程中总是搞砸了.将$ DAEMON_OPTS包含在引号中会改变一些事情...然后它们被视为一个引用...但从来没有正确的数字:)
回应命令行(开始 - 停止......)将正确的内容打印到屏幕上.但守护进程(真正的守护进程,而不是ls)抱怨错误的参数数量.
如何指定变量以使其中的引号正确地带到守护程序?
Aar*_*lla 15
尝试
DAEMON_OPTS="-la '/folder with space/'"
start-stop-daemon --start ... -- $DAEMON_OPTS
Run Code Online (Sandbox Code Playgroud)
会发生的是外部引号DAEMON_OPTS被剥离但内部(单引号)仍然存在.所以下一行将是:
start-stop-daemon --start ... -- -la '/folder with space/'
Run Code Online (Sandbox Code Playgroud)
这就是你想要的.
也可以通过转义实现相同的效果,但是你需要大量的转义:首先,在分配期间保护引号,然后在解析起始行并且扩展变量甚至一次或多或少的时候保护引号.:) bash -x是你这样的朋友.
[编辑]上面的代码可以在除了Linux之外的任何东西上使用Bourne和Korn shell.在Linux上,使用ksh或者bash,shell会添加额外的引号,这会引起整个事情:
FOLDER="/folder with space/"
DAEMON_OPTS="-la $FOLDER"
start-stop-daemon --start ... -- $DAEMON_OPTS
Run Code Online (Sandbox Code Playgroud)
如果你运行它-x,你会看到:
FOLDER='/folder with space/'
DAEMON_OPTS='-la ~/folder with space/'
ls -la '~/folder' with space/
Run Code Online (Sandbox Code Playgroud)
所以只有第一个词得到保护(可能是因为它包含一个特殊字符).如果我添加单引号$FOLDER,我得到:
FOLDER='/folder with space/'
DAEMON_OPTS='-la '\''~/folder with space/'\'''
ls -la ''\''~/folder' with 'space/'\'''
Run Code Online (Sandbox Code Playgroud)
做得好.解决方法:将选项拆分为两个变量:一个包含选项,另一个包含路径:
start-stop-daemon --start ... -- $DAEMON_OPTS "$DAEMON_PATH"
Run Code Online (Sandbox Code Playgroud)
[EDIT2]这也有效:
FOLDER="$HOME/folder with space/"
opt[0]=-la
opt[1]=$FOLDER
ls "${opt[@]}"
Run Code Online (Sandbox Code Playgroud)
即将单词放入数组中.
我以为我会发布我的工作初始化脚本中使用的最终引用:
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\""
Run Code Online (Sandbox Code Playgroud)
显然是一个不完整和非功能性的例子,但我希望你能得到它的要点.内部对逃脱的双引号是诀窍.
| 归档时间: |
|
| 查看次数: |
37210 次 |
| 最近记录: |