【问题标题】:Passing a space-separated System Property via a shell script doesn't work通过 shell 脚本传递以空格分隔的系统属性不起作用
【发布时间】:2018-08-22 15:00:24
【问题描述】:

我有这个 bash 文件:

#/bin/bash

PROP="-Dprop=foo bar"

java $PROP -jar Foo.jar

所以,我在这里要做的是将空格分隔的列表作为系统属性传递。但这不知何故不起作用:

Caused by: java.lang.ClassNotFoundException: bar

所以,Bash 似乎将-Dprop=foo bar 分解为-Dprop=foobar。我尝试了从双引号到转义空格字符的所有方法,但似乎没有任何效果。

【问题讨论】:

    标签: java bash


    【解决方案1】:

    需要在shell脚本$变量两边加上引号:

    PROP="-Dprop=foo bar"
    
    java "$PROP" -jar Foo.jar
    

    【讨论】:

    • 如何通过同一个shell变量传递多个系统属性?
    • 如果我们有PROP="-Dprop=foo bar"CMD="java "$PROP" -jar Foo.jar" 并执行CMD。似乎 ClassNotFoundException 会再次发生?请问这个怎么解决?
    • @DerekY - 最佳答案:不要那样做!如果您不进行多次重新扩展,Shell 引用就足够脆弱了。
    • @AlexBrand The give 方法不适用于多个属性
    【解决方案2】:

    试试 PROP=-Dprop="foo bar" 或者你可以这样做

    PROP="-Dprop=\"foo bar\""
    

    【讨论】:

    • 我认为这行不通。我认为它会在属性值中为您提供文字双引号字符。
    • @StephenC:不。在此处替换到命令行期间有一个扩展级别:java $PROP -jar Foo.jar
    • 我试过了,还是不行。见BashFAQ #050
    • 使用@Stephen C 提供的答案......我在我可以使用的bash 环境中本地运行它。他的方法奏效了。
    【解决方案3】:

    如果属性值有多个值有空格,则设置属性如下;

    PROP="-Dprop=foobar"
    PROP="$PROP -DpropTwo='hello world'"
    
    java "$PROP" -jar Foo.jar
    

    【讨论】:

      猜你喜欢
      • 2014-05-02
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 2017-02-18
      • 2019-10-16
      • 2015-03-28
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多