【问题标题】:How to change current working directory within a bash script on Mac OS X?如何在 Mac OS X 上的 bash 脚本中更改当前工作目录?
【发布时间】:2015-01-18 16:35:01
【问题描述】:

我正在努力解决一个小问题,我以前从未编写过 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 命令位于子shell 中,因此它只影响该子shell。如果要更改主 shell 的工作目录,则需要直接在脚本中运行它。
  • 您好安德鲁,感谢您的回复。这怎么能在脚本中完成?很抱歉,但在编写脚本方面我绝对是个菜鸟……
  • 使用cd,但在脚本的“顶层”。您正在一个新的范围内执行 cd。

标签: java macos bash shell


【解决方案1】:

尝试这样做:

cd "$(dirname "$0")/../Java"
SCRIPT_DIR=$(pwd)

【讨论】:

  • 不客气),在您的问题下的第一条评论中解释了为什么它以前不起作用
  • 好的,没关系 :) 我一定要尽快使用 bash 脚本...谢谢!
【解决方案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,但 pushdpopd 也回答了这个问题,并且在某些情况下比 cd 更灵活,尤其是当您确实 必须 遍历文件层次结构时在执行过程中多次。欲了解更多信息man pushdman popd、google 或相关文章,例如:https://unix.stackexchange.com/questions/77077/how-do-i-use-pushd-and-popd-commands

除此之外,即使是日常使用,cd 也很棒,但就我而言,我总是四处走动,很高兴能在我的 /Library/LaunchDaemons/ 中并简单地@ 987654330@; vim bashp0rn.sh; popd;并返回 /Library/LaunchDaemons/ 以加载和启动 (launchctl)。

现在,话虽如此,您无需更改应用程序工作目录即可启动应用程序:

...为了随后调用 java -jar MyApp.jar(第 3 行),并将其正确的根目录作为工作目录...

如果这是您的唯一要求 && 如果这是您的要求,因为在这种情况下,您试图通过将 pwd 的输出分配给 @ 来完成路径987654335@,那么我建议对完整路径进行硬编码,并改用eval 命令:

#!/bin/bash

app='/Applications/MyApp.app/_Contents/_Java/jre/bin/java -Xms256m -XX:PermSize=64m -jar "MyApp.jar"';

现在您可以从文件层次结构中的任何位置评估变量:

eval $app;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2016-01-02
    • 2011-08-30
    • 2014-12-02
    • 2015-02-22
    相关资源
    最近更新 更多