如何使用Shell脚本将目录更改为脚本所在的目录?(针对OSX系统)

6

我正在使用苹果的自动化程序来创建一个Shell脚本。如果我更改目录到jar文件所在的具体位置,我可以让它运行。但是如果我想要更改目录到Shell脚本随时运行的任何地方怎么办?

现在我有以下代码,它可以正常工作:

cd desktop/CommonDenom/
java -XstartOnFirstThread -jar CommonDenom.jar

我知道有一种方法可以定位Shell脚本启动时所在的目录,但是我似乎无法让任何东西起作用。请提供具体的指令,因为我还没有使用过Automator很长时间。除非有人能够指定如何在没有Automator的情况下编写脚本。提前致谢。

4个回答

4

在shell脚本中,这个标准惯用语是dirname $0。变量$0是执行的脚本路径,而dirname命令接受一个路径并剥离最后一个组件,以留下包含目录的路径。

cd "`dirname $0`"

谢谢。这个问题有点自己解答了,但是如果可以请您确认一下: cd "dirname $0"是特定于Shell脚本的命令,对吗?如果不是脚本的一部分,这在终端中会失败并且理所当然,因为它没有上下文。 - dbconfession
@Ian Roberts cd "dirname $0" 不起作用。它返回“运行Shell脚本”遇到错误。检查操作的属性,然后尝试重新运行工作流。这是我正在尝试的:cd“dirname $0” cd CommonDenom/ java -XstartOnFirstThread -jar CommonDenom.jar 这是有效的:cd /Applications/CommonDenom java -XstartOnFirstThread -jar CommonDenom.jar Shell脚本位于Macintosh HD/Applications中。其余文件,包括jar文件,位于/Macintosh HD/Appications/CommonDenom/中。 - dbconfession
等一下,那些引号里的反引号应该在那里吗?cd "<tick>dirname $0<tick>",还是你只是为了发布格式而加上它们的? - dbconfession
@StuartKuredjian 反引号是必要的。它们是运行一个命令并捕获其输出到一个字符串中以便作为另一个命令的一部分使用的方式。 - Ian Roberts
谢谢。但似乎它并没有起作用。我创建了一个Automator应用程序,其中包含“运行Shell脚本”操作,具有以下几行:' cd "dirname $0"' open test.txt但它返回错误:动作“运行Shell脚本”遇到错误。请检查该操作的属性,然后尝试再次运行工作流程。 - dbconfession
1
顺便说一下,我刚在我的 Mac 上的 shell 脚本中使用了这个,并由于一些奇怪的错误稍作更改。如果路径中有空格,则可能需要额外的引号来包含 $0cd "\dirname -- "$0"`"` - tomlogic

1

1

我想在这里发表一下意见。我看到有些人遇到了这个问题。如果你只使用OSX并且正在编写自己的脚本,这将解决问题 :) 这有点像一个hack,但非常有效。

#! /bin/bash 

sudo /Applications/XAMPP/xamppfiles/xampp startapache

open /Applications/XAMPP/htdocs

0

我不确定你的意思是“你想要改变目录到脚本运行的位置”,因为当你启动时,你已经在脚本运行的目录中了,所以没有必要在那里改变目录。我想你的意思是你希望脚本停留在它开始的地方,但仍然能够找到jar文件。

如果是这样,你可能只需要以下内容而无需更改目录:

java -XstartOnFirstThread -jar ~/Desktop/CommonDemon/CommonDemon.jar

“因为你启动脚本时,当前工作目录将会是运行脚本的目录” - 不,不一定。假设您的当前工作目录是 /foo/bar,那么您可以使用 /some/other/dir/someScripts.sh 运行脚本,此时的当前目录将不会是脚本所在的目录。 - user330315
好的观点,谢谢。也许楼主可以帮忙更清晰地陈述他想要什么... - Mark Setchell
马克是正确的。如果正在启动的.jar文件放置在“应用程序”或“桌面”或任何其他地方,当终端首次打开时,它不在与启动文件相同的目录中。因此,我需要一种方法来告诉脚本首先更改为与启动文件相同的目录。我曾经按照另一篇帖子中使用dirnmame $0的说明,但它没有起作用。现在我会再试一次,因为我有新鲜的眼睛。 - dbconfession

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接