@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 b
1つの引数として表示されます。
文字列に余分"
に書き込んだとしても、bashは変数の内容をとにかく分離するため、機能しません。
TEST="\"a b\""
./print_args $TEST
あなた"a
とb"
別々の引数として与えます。これを処理できる唯一の方法は、変数を定義する場所ではなく、変数を使用"
する場所を追加することです。
したがって、あなたの場合、解決策は次のとおりです。
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