在 OS X 上运行 shell 脚本而不出现终端窗口?

tou*_*ira 30 terminal keyboard-shortcuts shell-script macos

我正在尝试设置一些打开特定 iTerm 会话的键盘快捷键,我可以使用 BetterTouchTool 和一些 AppleScript 魔法来实现。问题在于 OS X 坚持为您通过 GUI 执行的任何 shell 脚本(即来自 Finder,或作为来自 BetterTouchTool 的键盘快捷键)打开一个终端窗口。如果我直接从另一个终端运行脚本,则不会出现终端窗口。

我发现的一种解决方法是将脚本包装在 .app 目录中,这解决了多余终端窗口的问题,但还有一些其他问题(例如,OS X 似乎将每个生成的 iTerm 窗口视为一个单独的应用程序,使我的 Dock 变得混乱)。(编辑:这种行为实际上是由我的脚本中的错误引起的,见下文)

我还尝试将终端应用程序分配给 Spaces 设置中的另一个虚拟桌面,试图将其移出视线,但它只会在运行脚本之前先切换到该桌面。

有没有办法完全禁用这种行为?我已经在终端首选项中找到了在脚本完成后关闭窗口的设置,但是让终端窗口弹出一秒钟仍然很烦人。

cre*_*gox 26

打开Automator,选择Application,添加一个Run Shell Script操作,然后将 Shell 命令放在引号之间(如果您有文件,只需拖放即可)。

除了播放之外,现在您可以保存(作为应用程序在任何地方),甚至可以设置图标


Jef*_*ffB 13

这是一个几乎不费吹灰之力的快速而肮脏的示例(对于名为“myapp”的应用程序):

  1. 制作部分应用程序层次结构:

        mkdir -p ./myapp.app/Contents/MacOS
    
    Run Code Online (Sandbox Code Playgroud)
  2. 确保脚本的第一行具有所需程序的完整路径,例如,

    #!/bin/bash
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将您的 shell 脚本命名为“myapp”(无引号,无扩展名),赋予其执行权限,然后将其放入 MacOS 子目录中。给它执行权限:

    chmod ugo+x myapp
    
    Run Code Online (Sandbox Code Playgroud)
  4. 转到 Contents 子目录并创建一个包含字符串的 PkgInfo 文件:APPL???? [字符串末尾没有行终止符!] 使用 cat(1) 实用程序创建文件:

    cat > PkgInfo
    APPL????
    
    Run Code Online (Sandbox Code Playgroud)

    输入字符串后(不要按回车键!),输入两个 control-D,这将关闭
    没有行终止符的文件并返回到 shell 提示符。)

  5. 从查找器中双击您的新“应用程序”。它将在没有窗口的情况下运行。

  • 为我在莫哈韦沙漠 (10.14.3) 工作过。我真的很喜欢这种方法。谢谢。 (2认同)

小智 5

您可能想查看Platypus,它从 shell 脚本和其他解释脚本创建 Mac OS X 应用程序。


tig*_*tig 2

如果您添加键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>
Run Code Online (Sandbox Code Playgroud)