我正在努力解决一个小问题,我之前从未写过一个bash脚本,对于知道它是如何正确完成的人来说这可能是一件小事。
我有以下文件夹结构(无法更改):
MyApp.app
|_Contents
|_Java
|_MyApp.jar
|_MacOS
|_launch.sh
launch.sh 脚本应该启动MyApp.jar可执行文件,目前看起来如下:
#!/bin/bash
SCRIPT_DIR=$(cd "$(dirname "$0")/../Java"; pwd)
exec "$SCRIPT_DIR/jre/bin/java" -Xms256m -XX:PermSize=64m -jar "MyApp.jar"
启动launch.sh脚本时,第二行应将当前工作目录从 MyApp.app/Contents/MacOS 更改为 MyApp.app/Contents/Java 为了随后调用 java -jar MyApp.jar (第3行),将其正确的根目录作为工作目录......
但是一旦MyApp.jar启动,我就打印出Java应用程序中的当前工作目录:
System.out.println(System.getProperty("user.dir"));
...并打印出launch.sh脚本的目录,即 MyApp.app/Contents/MacOS ,而不是 MyApp.app/Contents/Java
高度赞赏如何正确更改bash脚本中的目录的任何想法:)...?!
答案 0 :(得分:2)
您始终可以使用cd命令(更改目录)。但是一个更优化的解决方案,如果你必须更改目录,可能正在使用pushd
& popd
命令用于构建堆栈。
在这种情况下,您可以硬编码脚本在执行期间必须导航到的文件路径:
_java=/Applications/MyApp.app/_Contents/_Java;
然后使用pushd和popd(将目录推入堆栈,从堆栈弹出目录):
# Currently in /Applications/MyApp.app/_Contents/_MacOS/
pushd $_java;
# Do what you have to do in the _Java working directory (./ = current working directory)
exec "./jre/bin/java" -Xms256m -XX:PermSize=64m -jar "MyApp.jar";
# Print the working directory and return to bottom of stack
pwd; popd;
没有什么可以反对使用cd,但pushd
& popd
也回答了这个问题,并且在某些情况下比cd更灵活,尤其是在执行期间你真的 遍历文件层次结构时。有关详细信息man pushd
,man popd
,Google或相关文章,例如:https://unix.stackexchange.com/questions/77077/how-do-i-use-pushd-and-popd-commands
除此之外,即使是日常使用,CD也很棒,但在我的情况下,我总是四处走动,很高兴能够进入我的 / Library / LaunchDaemons / ,并且只是{ {1}}; pushd ~/Documents/Scripts/
; vim bashp0rn.sh
;并返回 / Library / LaunchDaemons / 加载&启动(popd
)。
现在,据说,您无需更改应用工作目录即可启动应用程序:
...为了随后调用java -jar MyApp.jar(第3行),将其正确的根目录作为工作目录...
如果这是您的唯一要求&& ,如果这是您的要求,因为在这种情况下,您尝试通过分配launchctl
来完成路径输出到pwd
,然后我会建议硬编码完整路径并使用$SCRIPT_DIR
命令代替:
eval
现在,从文件层次结构的任何位置,您都可以评估变量:
#!/bin/bash
app='/Applications/MyApp.app/_Contents/_Java/jre/bin/java -Xms256m -XX:PermSize=64m -jar "MyApp.jar"';
答案 1 :(得分:1)
尝试这样做:
cd "$(dirname "$0")/../Java"
SCRIPT_DIR=$(pwd)