我有运行 jar 的脚本,如下所示。
user="Tim Tom";
jarfile=./app.jar
SC_CD="java -jar -Xms512m -Xmx2048m -DUSER='$user' $jarfile"
nohup $SC_CD
我收到错误消息为
Error: Unable to access jarfile Tom
所以,我的理解是,它是以空格后面的单词作为jar名称。
因此,我的问题是, 如何传递带空格的参数?
答案1
基于埃里克·雷诺夫(Eric Renouf)对此答案先前迭代的评论,内容涉及如何nohup
并bash
密谋阻止逃逸空间
user="Tim Toms"
jarfile=./app.jar
SC_CD="java -jar -Xms512m -Xmx2048m -DUSER='$user' $jarfile"
echo $SC_CD > temp.sh
nohup bash temp.sh
如果重点是让 java 在后台运行,我可能会做类似的事情
echo java -jar -Xms512m -Xmx2048m -DUSER=\'$user\' $jarfile | at now
并被遗忘nohup
(如果有一些垃圾邮件需要清理又如何)
====下面是旧答案,这样评论才有意义。否则忘记下面====
虽然看起来你的语句实际上确实nohup
用单引号中的“Tim Tom”进行了调用,但也许nohup
是system()
用一个简单的字符串进行调用而不是进行调用exec
,并使字符串丢失引号。
我刚刚通过echo
在前面放一个来进行测试nohup
我真的无法测试它,但我建议尝试将你的第一行变成
user='"Tim Tom"'
因为单引号应该防止扩展并且应该将双引号传递给nohup
我的基础是制作一个测试脚本,例如
ser="Tim Tom";
jarfile=./app.jar
SC_CD="java -jar -Xms512m -Xmx2048m -DUSER='$user' $jarfile"
echo nohup $SC_CD
然后当我sh -x test.sh
得到
+ user='Tim Tom'
+ jarfile=./app.jar
+ SC_CD='java -jar -Xms512m -Xmx2048m -DUSER='\''Tim Tom'\'' ./app.jar'
+ echo nohup java -jar -Xms512m -Xmx2048m '-DUSER='\''Tim' 'Tom'\''' ./app.jar
nohup java -jar -Xms512m -Xmx2048m -DUSER='Tim Tom' ./app.jar
但是进行建议的更改会给出
+ user='"Tim Tom"'
+ jarfile=./app.jar
+ SC_CD='java -jar -Xms512m -Xmx2048m -DUSER='\''"Tim Tom"'\'' ./app.jar'
+ echo nohup java -jar -Xms512m -Xmx2048m '-DUSER='\''"Tim' 'Tom"'\''' ./app.jar
nohup java -jar -Xms512m -Xmx2048m -DUSER='"Tim Tom"' ./app.jar
请注意,在这两种情况下,echo 显示 nohup 应该在其参数中至少获得第一级引号。这就是为什么我建议添加一个额外的级别