双击Mac上的shell脚本

时间:2017-07-07 13:24:41

标签: macos shell

我有一个运行jar文件的小脚本:

#!/bin/bash

prefix="foo";
name=`ls ${prefix}*.jar`;
echo $name;
java -jar $name prop1.properties prop2.properties

当我使用./myscript.sh在终端中运行它时,它工作正常并且jar文件执行,但是当我在myscript.command中重命名并双击它时,我有这个错误:

ls: foo*.jar : No such file or directory

我看到显然.command文件在根目录下打开一个终端,所以我尝试使用它找到包含myscript.command的目录:

dir = 'find <dir> -maxdepth 1 -type d -name '*myDirContainingJar*' -print -quit'
cd $dir

但是dir只是空白,任何想法???

2 个答案:

答案 0 :(得分:5)

在MacOS上打开来自Finder的shell脚本(无论是扩展程序.command还是无扩展程序的可执行shell脚本)使当前用户的主目录当前目录(从macOS 10.12开始)。

要在<{1}}脚本中显式更改脚本本身所在的目录,请使用:

bash

在此调用方案中,以下符合POSIX的变体(使用cd -- "$(dirname -- "$BASH_SOURCE")" 代替$0)也可以使用:$BASH_SOURCE

注意:

  • 通常,如果您的脚本是通过符号链接调用的,并且您想要更改为目标的目录(实际的脚本文件的目录而不是符号链接所在的目录,需要做更多的工作 - 请参阅我的this answer

  • 但是,当从 Finder 打开脚本时,此问题不适用,因为 Finder本身将符号链接解析为其(终极)目标,然后调用目标直接。

答案 1 :(得分:0)

您的脚本存在的问题是它使用与您测试的不同的工作目录运行。当您在脚本中执行ls something时,脚本将在当前工作目录中查找(如果您在终端中cd,则不在)在脚本所在的目录中。通常,在编写这样的脚本时,您应该使用您要引用的文件的完整路径,或者找出脚本的目录并指向相对于该文件的文件。 One solution适用于Bash,但它可能不在您正在使用的shell中。