我有一个运行jar文件的小脚本:
#!/bin/bash
prefix="foo";
name=`ls ${prefix}*.jar`;
echo $name;
java -jar $name prop1.properties prop2.properties
Run Code Online (Sandbox Code Playgroud)
当我使用./myscript.sh在终端中运行它时,它工作正常并且jar文件执行,但是当我在myscript.command中重命名并双击它时,我有这个错误:
ls: foo*.jar : No such file or directory
Run Code Online (Sandbox Code Playgroud)
我看到显然.command文件在根目录下打开一个终端,所以我尝试使用它找到包含myscript.command的目录:
dir = 'find <dir> -maxdepth 1 -type d -name '*myDirContainingJar*' -print -quit'
cd $dir
Run Code Online (Sandbox Code Playgroud)
但是dir只是空白,任何想法???
在macOS上从Finder打开shell脚本(无论是扩展.command
还是无扩展可执行shell脚本)使当前用户的主目录成为当前目录(从macOS 10.12开始).
要明确地改变其中的目录脚本本身所在的bash
脚本,请使用:
cd -- "$(dirname -- "$BASH_SOURCE")"
Run Code Online (Sandbox Code Playgroud)
在这种调用场景,下面符合POSIX标准的变化,它使用$0
代替$BASH_SOURCE
,将工作太: cd -- "$(dirname -- "$0")"
注意:
通常,如果您的脚本是通过符号链接调用的,并且您想要更改为目标的目录(实际脚本文件的目录而不是符号链接所在的目录),则需要做更多的工作 - 请参阅我的回答.
但是,从Finder打开脚本时,此问题不适用,因为Finder本身会将符号链接解析为其(终极)目标,然后直接调用目标.