我正在尝试设置一些键盘快捷键来打开特定的 iTerm 会话,我可以使用 BetterTouchTool 和一些 AppleScript magic 来实现。问题是 OS X 坚持为您通过 GUI 执行的任何 shell 脚本打开终端窗口(即从 Finder 执行,或作为 BetterTouchTool 的键盘快捷键)。如果我直接从另一个终端运行脚本,则不会出现终端窗口。
我发现的一个解决方法是将脚本包装在 .app 目录中,这解决了多余终端窗口的问题,但也存在其他一些问题(例如,OS X 似乎将每个生成的 iTerm 窗口视为一个单独的应用程序,使我的 dock 变得混乱)。(编辑:这种行为实际上是由我的脚本中的一个错误引起的,见下文)
我还尝试在 Spaces 设置中将终端应用程序分配给另一个虚拟桌面,以尝试将其移出视线,但它会在运行脚本之前先切换到该桌面。
有没有办法完全禁用此行为?我已经在终端首选项中找到了在脚本完成后关闭窗口的设置,但终端窗口弹出一秒钟仍然很烦人。
答案1
答案2
这是一个几乎不费吹灰之力的快速而粗糙的示例(针对名为“myapp”的应用程序):
建立部分应用程序层次结构:
mkdir -p ./myapp.app/Contents/MacOS
确保脚本的第一行包含所需程序的完整路径,例如,
#!/bin/bash
将您的 shell 脚本命名为“myapp”(无引号、无扩展名),授予其执行权限,然后将其放在 MacOS 子目录中。要授予其执行权限:
chmod ugo+x myapp
转到 Contents 子目录并创建一个包含以下字符串的 PkgInfo 文件:APPL???? [字符串末尾没有行终止符!] 使用 cat(1) 实用程序创建该文件:
cat > PkgInfo APPL????
键入字符串后(不要按回车键!),输入两个 control-D,这将关闭
没有行终止符的文件并返回到 shell 提示符。)从 Finder 中双击您的新“应用程序”。它将在无窗口的情况下运行。
答案3
你可能想看看鸭嘴兽,它从 shell 脚本和其他解释脚本创建 Mac OS X 应用程序。
答案4
如果您添加键LSUIElement
并将其设置1
为Info.plist
应用程序,它将不会在 Dock 中创建图标。
下面是Info.plist
我的小型 shell 脚本应用程序:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleExecutable</key>
<string>launch</string>
<key>CFBundleIconFile</key>
<string>launch</string>
<key>LSUIElement</key>
<string>1</string>
</dict>
</plist>