如何在Mac OS X上的bash脚本中更改当前工作目录?

时间:2014-11-20 17:36:59

标签: java macos bash shell

我正在努力解决一个小问题,我之前从未写过一个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脚本中的目录的任何想法:)...?!

2 个答案:

答案 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 pushdman 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)