1
#!/bin/bash
# this works: java '-XX:OnOutOfMemoryError=nohup bash -c "service jira stop;service jira stop" &' -version
JVM_SUPPORT_RECOMMENDED_ARGS="" # WHAT TO PUT HERE !?! so the last line will execute the command above?
JAVA_OPTS=" ${JAVA_OPTS} ${JVM_REQUIRED_ARGS} ${DISABLE_NOTIFICATIONS} ${JVM_SUPPORT_RECOMMENDED_ARGS} ${JVM_EXTRA_ARGS} ${JIRA_HOME_MINUSD}"
set -x
java $JAVA_OPTS -version

可能であれば、JVM_SUPPORT_RECOMMENDED_ARGS以外の行には触れないでください。

4

1 に答える 1

5

@raukhの答えは正しいですが、つまり、エスケープする"必要がありますが、別のポイントも見逃しています。

せっかちな人への答え:bashがの内容を別の引数に分離するのを防ぐために、追加する必要もあり\"ます。${JVM_SUPPORT_RECOMMENDED_ARGS}JVM_SUPPORT_RECOMMENDED_ARGS


完全な答え:

この例を想像してみてください。print_argsが、引数を1行にエコーするプログラムであると仮定します。

TEST="a b"
./print_args $TEST

これは、個別の引数として出力aされます。bこれは、"が削除され、実際に実行されるコマンドが次のとおりであるためです。

./print_args a b

コマンドに変数をすべて1つのパラメーターとして表示させるには、次のように配置する必要があります"

TEST="a b"
./print_args "$TEST"

a b1つの引数として表示されます。

文字列に余分"に書き込んだとしても、bashは変数の内容をとにかく分離するため、機能しません。

TEST="\"a b\""
./print_args $TEST

あなた"ab"別々の引数として与えます。これを処理できる唯一の方法は、変数を定義する場所ではなく、変数を使用"する場所を追加することです。

したがって、あなたの場合、解決策は次のとおりです。

JVM_SUPPORT_RECOMMENDED_ARGS="java '-XX:OnOutOfMemoryError=nohup bash -c \"service jira stop;service jira stop\" &' test"
JAVA_OPTS=" ${JAVA_OPTS} ${JVM_REQUIRED_ARGS} ${DISABLE_NOTIFICATIONS} \"${JVM_SUPPORT_RECOMMENDED_ARGS}\" ${JVM_EXTRA_ARGS} ${JIRA_HOME_MINUSD}"

最初の行は、raukhが提案したとおりです。\"2行目は。の周りに追加されました${JVM_SUPPORT_RECOMMENDED_ARGS}


これをテストしたい場合は、次に例を示します。

test.c:

#include <stdio.h>

int main(int argc, char **argv)
{
    int i;
    for (i = 0; i < argc; ++i)
        printf("%d: %s\n", i, argv[i]);
    return 0;
}

$ gcc -o print_args test.c

$ TEST="java '-XX:OnOutOfMemoryError=nohup bash -c \"service jira stop;service jira stop\" &' test"; ./print_args $TEST
0: ./print_args
1: java
2: '-XX:OnOutOfMemoryError=nohup
3: bash
4: -c
5: "service
6: jira
7: stop;service
8: jira
9: stop"
10: &'
11: test

$ TEST="java '-XX:OnOutOfMemoryError=nohup bash -c \"service jira stop;service jira stop\" &' test"; ./print_args "$TEST"
0: ./print_args
1: java '-XX:OnOutOfMemoryError=nohup bash -c "service jira stop;service jira stop" &' test
于 2012-07-27T12:09:48.930 に答える