雖然@ raukh的回答是正確的,即您必須逃避"
,但您也錯過了另一點。
對不耐煩的回答:您還需要在${JVM_SUPPORT_RECOMMENDED_ARGS}
附近添加\"
,以防止bash將JVM_SUPPORT_RECOMMENDED_ARGS
的內容分隔爲不同的參數。
完整回答:
想象這個例子中,假設print_args
是呼應其每個參數在一行
TEST="a b"
./print_args $TEST
這將輸出a
和b
作爲獨立參數的程序。這是因爲"
被刪除,實際上執行的指令是:
./print_args a b
爲了使您的命令來查看您的變量都作爲一個參數,你必須把它放在"
:
TEST="a b"
./print_args "$TEST"
威爾顯示a b
作爲一個參數。
即使你在你的字符串編寫額外的"
,它不會工作,如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建議。第二行添加了\"
約${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
哇,這是一個很長的答案。我重新編寫了這個問題,使其更容易。我正在尋找一條線路解決方案,不多也不少。一些不需要在這一行之外進行修改的東西。 – sorin 2012-07-27 12:35:18
@votingmeisfree,恐怕你不能。所有你需要做的就是在'$ {JVM_SUPPORT_RECOMMENDED_ARGS}'周圍加入'\「',這是不可能的嗎?! – Shahbaz 2012-07-27 12:40:04
原因是,bash _will_擴展你的變量到不同的參數中(即使在''''變量本身,參見上面的參數5到9)。 (我知道)避免這種情況的唯一方法是在''''裏面放置'$ VARIABLE'。 – Shahbaz 2012-07-27 12:41:40