Ruby 对反引号表达式中字符串替换的限制?

nte*_*rry 5 ruby runtime-error limit string-interpolation backticks

好的,所以我尝试执行以下代码:

`#{@daemon_path} --name=#{@app_name} --command=#{@java_path} -- -jar #{jetty_jar} #{@war_path} #{random_port}`
sleep(10) #give war time to error out and die if its going to
`#{@daemon_path} --running --name=#{@app_name}`
Run Code Online (Sandbox Code Playgroud)

变量值为:

  • @daemon_path = path/to/daemon(对于我的系统正确)
  • @app_name = foobarbazquux
  • @command = path/to/java (对于我的系统也是正确的)
  • jetty_jar = 一种返回自定义 jar 路径的方法,该自定义 jar 支持独立的 jetty 容器(已测试;有效)
  • @war_path = /path/to/helloworld/war (在独立码头容器中测试;有效)
  • random_port = 一个返回 10000 到 65535 之间随机端口号的方法(暂时将其更改为返回 8000 或 22,具体取决于我是否想要失败启动战争)

我收到此错误(检查了 bash 中的命令,它们工作正常):

无效参数:未提供命令

用法:daemon [选项] [--] [cmd arg...]

我通过在上述命令周围添加引号来修复上述错误,如下所示:

"`#{@daemon_path} --name=#{@app_name} --command=#{@java_path} -- -jar #{jetty_jar} #{@war_path} #{random_port}`"

"`#{@daemon_path} --running --name=#{@app_name}`"
Run Code Online (Sandbox Code Playgroud)

好的,代码执行后,我用 $? 检查输出?并注意 0 返回代码。它应该是 1。我在 bash 中运行它,得到 1。如果我手动为每个变量输入所有正确的值,它就会正常工作。

此外,如果我执行脚本,则传入所有值,如下所示:

`./daemon_script_file #{@daemon_path} #{@app_name} #{@java_path} #{jetty_jar} #{@war_path} #{random_port}`
Run Code Online (Sandbox Code Playgroud)

到脚本守护程序脚本文件:

#!/bin/bash
set -x

d_bin=$1
name=$2
cmd=$3
jar=$4
war=$5
port=$6

$d_bin --name=$name --command=$cmd -- -jar $jar $war $port

sleep 10

$d_bin --name=$name --running

result=$?

exit $result
Run Code Online (Sandbox Code Playgroud)

我得到以下调试跟踪输出:

+ d_bin=/usr/bin/daemon
+ name=
+ cmd=
+ jar=
+ war=
+ port=
+ /usr/bin/daemon --name= --command= -- -jar
+ sleep 10
+ /usr/bin/daemon --name= --running
+ result=1
+ exit 1
sh: 2: foobarbazquux: not found
invalid file (bad magic number): Exec format error
Run Code Online (Sandbox Code Playgroud)

有人知道为什么吗?我在这里做了一些非常愚蠢的事情吗?

作为旁注,字符串:

"#{@daemon_path} --name=#{@app_name} --command=#{@java_path} -- -jar #{jetty_jar} #{@war_path} #{random_port}"
Run Code Online (Sandbox Code Playgroud)

决心:

"/usr/bin/daemon  --name=foobarbazquux --command=/usr/java/jdk1.7.0_21/bin/java  -- -jar /home/nterry/JettyContainer-1.0.b4-jar-with-dependencies.jar /home/nterry/helloworld.war 8080"
Run Code Online (Sandbox Code Playgroud)

哪个是完全正确的

nte*_*rry 1

@Casper:你是对的。@daemon_path 以无效字符结尾 非常感谢。