关于macos:Double在Mac上单击一个shell脚本

Double Clicking a shell script on Mac

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

1
2
3
4
5
6
#!/bin/bash

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

当我使用./myscript.sh在终端中运行它时,它工作正常,JAR文件执行,但是当我在myscript.command中重命名它并双击它时,出现了以下错误:

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

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

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

但是dir只是空白,有什么想法吗????


在MacOS上从finder打开shell脚本(无论它是扩展名.command还是无扩展名的可执行shell脚本)都会使当前用户的主目录成为当前目录(从MacOS 10.12开始)。

要显式更改脚本本身所在的目录,请使用:

1
cd --"$(dirname --"$BASH_SOURCE")"

在这个调用场景中,使用$0代替$BASH_SOURCE的下列符合POSIX的变体也可以工作:cd --"$(dirname --"$0")"

注:

  • 通常,如果您的脚本是通过symlink调用的,并且您希望更改到目标的目录(实际脚本文件的目录,而不是symlink所在的目录),则需要进行更多的工作-请参见我的回答。

  • 然而,当从finder打开脚本时,这个问题不适用,因为finder本身解决了一个到其(最终)目标的符号链接,然后直接调用目标。


您的脚本的问题在于,它运行的工作目录与您测试的工作目录不同。在脚本中执行ls something操作时,脚本将查找当前工作目录(如果您在终端中,则最后一个执行cd操作的目录),而不是脚本所在的目录。一般来说,在编写这样的脚本时,您应该使用所引用的文件的完整路径,或者找出脚本的目录并指向与之相关的文件。一个解决方案在bash中有效,但它可能不在您使用的shell中。