当我在 OSX 中打开特定应用程序时,如何自动运行 shell 脚本?

当我在 OSX 中打开特定应用程序时,如何自动运行 shell 脚本?

最近,我在一个一直想完成的项目上遇到了麻烦。使用 Automator,但我不知道如何完成这个项目。有一个叫做 Brackets 的脚本编辑应用程序,我想让它在每次打开应用程序时执行名为 tty.js 的 shell 命令。任何能给我的帮助都会很棒

答案1

您可以尝试进入应用程序的 .app 文件夹并重命名二进制文件,创建一个脚本文件(标记为可执行文件),该文件命名为以前的可执行文件,它将包含对现在重命名的可执行文件的引用以及您正在编写的脚本。例如

cd /Applications/Brackets.app/Contents/MacOS
mv Brackets BracketsReal
echo "tty.js" > Brackets
echo "BracketsReal &" >> Brackets
chmod +x Brackets

这应该创建一个文本脚本,然后启动你的脚本和应用程序......

编辑

Appname.app/Contents/MacOS/支持文件夹中的脚本。

第一行#!/bin/sh(又名shebang是必须的

移动真实可执行文件并使其从脚本执行的技术被称为wrappingGimp 或 XQuartz(Xorg/X11)等应用程序,并且也被使用在 MacOS 上。

如果我正确理解了用户想要实现的目标,运行Bracket并自动打开文件tty.js,除了缺失之外shebang,还需要考虑其他一些因素。

为了正确包装 BracketsReal,Brackets 应该是这样的:

#!/bin/sh
exec "$(dirname "$0")/BracketsReal"

这应该像我们从未将 Brackets 移动到 BracketsReal 一样运行。

exec是 shell 的内置命令

$0是系统传递给执行的 shell 脚本的一个特殊参数,当使用点击应该是脚本的完整路径:

/Applications/Brackets.app/Contents/MacOS/Brackets

dirname是一个shell命令,只获取目录部分而不获取文件名,$( )是一个命令替换,一旦执行,该行将变成:

exec /Applications/Brackets.app/Contents/MacOS/BracketsReal

因此,我们可以将应用程序从/Applications其他文件夹移出,并且仍然可以运行它。

此时我们应该检查BracketsReal(可能是脚本本身)是否接受在命令行上作为参数打开的文件(并且最终是否需要一些特殊的语法)如果它确实接受参数那么该行将变成如下内容:

exec "$(dirname "$0")/BracketsReal" "/path/to/the/file/tty.js"

最后要注意的是,要检查包装器脚本是否有问题,只需打开终端并运行包装器,在终端提示符下只需输入/粘贴:

/Applications/Brackets.app/Contents/MacOS/Brackets

权限或语法错误将打印在终端窗口中。

答案2

键盘大师有一个在应用程序启动时运行宏的选项:

您可能还会为脚本指定快捷方式喜欢open -a Brackets;tty.js然后总是使用该脚本来打开括号。

相关内容