[英]How to change current working directory within a bash script on Mac OS X?
我正在努力解决一个小问题,我以前从未写过一个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脚本中的目录的任何想法都非常感激:)...?!
您始终可以使用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 /并简单地推 pushd ~/Documents/Scripts/
; vim bashp0rn.sh
; popd
; 然后返回/ Library / LaunchDaemons /加载和启动( launchctl
)。
现在 ,说到这一点,您无需更改应用程序工作目录即可启动应用程序:
...为了随后调用java -jar MyApp.jar(第3行),其正确的根目录作为工作目录...
如果这是你的唯一要求&&如果这是你的要求,因为在这种情况下你试图通过将pwd
的输出分配给$SCRIPT_DIR
来完成路径,那么我建议硬编码完整路径并使用eval
命令代替:
#!/bin/bash
app='/Applications/MyApp.app/_Contents/_Java/jre/bin/java -Xms256m -XX:PermSize=64m -jar "MyApp.jar"';
现在,从文件层次结构的任何位置,您都可以评估变量:
eval $app;
尝试这样做:
cd "$(dirname "$0")/../Java"
SCRIPT_DIR=$(pwd)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.