在OS X上运行Shell脚本而没有出现终端窗口?


23

我试图设置一些键盘快捷键来打开特定的iTerm会话,这可以通过BetterTouchTool和一些AppleScript魔术来完成。问题是OS X坚持要为您通过GUI(例如,从Finder或从BetterTouchTool作为键盘快捷键)执行的任何外壳脚本打开“终端”窗口。如果直接从另一个终端运行脚本,则不会出现终端窗口。

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

我还尝试将“终端”应用程序分配到“空间”设置中的另一个虚拟桌面,以将其移到视线范围之外,但是随后它将仅在运行脚本之前首先切换到该桌面。

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


对不起,我不太了解。您想对这些Shell脚本做什么?是否要通过Shell脚本打开iTerm?您是在专门谈论Terminal.app还是将iTerm与“ Terminal”混合使用?您可以张贴一个示例来说明您要运行的内容吗?
slhck 2011年

我已经设置了几个iTerm会话来启动普通的shell,打开Rails控制台,显示Rails日志等。我仅使用iTerm,无论出于什么愚蠢的原因,OS X都会自动打开Terminal。但是无论如何,我找到了一种使捆绑方法正确运行的解决方案(请参阅已编辑的问题)。
toupeira

我知道了!好吧,如果您可以回答自己的问题(使用下面的按钮)并告诉我们您做了什么或如何解决问题,那就太好了。也许在您的问题中张贴一些示例,然后添加一个简短的答案。这样,如果有人偶然发现了您的帖子,他们可能会从中学到一些东西!
slhck 2011年

好吧,我仍然没有实际问题的答案(即,如何完全避免使用Terminal,而不必使用.app包装器),所以我宁愿将其打开以防有人启发我。
toupeira 2011年

1
我还是很困惑。你希望通过由Automator的创建。应用程序来运行它们?
slhck 2011年

Answers:


21

打开Automator,选择“ 应用程序”,添加一个“运行Shell脚本”操作,然后将Shell命令放在引号之间(如果有文件,则可以将其拖放)。

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


我试图从全屏应用程序以这种方式运行命令,但是它总是在后台打开它。我必须通过添加a &来以非阻塞方式在shell中后台命令,然后调用AppleScript将应用程序(以我的情况mplayermplayer myvideo.avi &; osascript -e 'tell application "System Events" to set frontmost of the first process whose displayed name is "mplayer" to true'
为例

酷哈克@mcb。但是我不明白为什么。通常,我们要隐藏终端窗口,因为它将打开另一个窗口,即主窗口。如果您需要mplayer的第一个终端窗口,我想它不会打开另一个窗口,那么为什么您要首先隐藏它?
cregox

我正在mplayer从幻灯片中播放视频(在Skim中)。如果将“略读”设置为全屏,则播放器会停留在后台的错误,不过我不确定该错误是否仅与“略读”或所有全屏应用有关,因此我认为我将在此处发布解决方案。
Lenar Hoyt

6

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

  1. 建立部分应用程序层次结构:

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

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

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

    cat > PkgInfo
    APPL????
    

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

  5. 双击查找器中的新“应用”。它将没有窗口运行。


无法在10.13.6上运行,错误消息显示“您无法打开应用程序“ LoginSessionTimeLimit.app”,因为这种类型的Mac不支持该应用程序。”
道格拉斯

1
为我做过莫哈韦(10.14.3)的工作。我真的很喜欢这种方法。谢谢。
loco.loop

在10.13.6上为我工作。@Douglas举行尝试“手动”运行脚本,即从终端运行。可能它退出并出现错误,因此对您
不起作用

大!在莫哈韦10.14.6测试的工作
尼古拉Mingotti

4

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


3

如果您喜欢Alfred之类的应用程序启动器,这是一个小解决方法。我每天都在使用它,并且已经购买了Powerpack,它使您可以运行无提示的shell脚本。

在此处输入图片说明

它们在运行时不会打开终端,并且可以绑定到任何关键字序列。它们甚至可以包含参数,并具有其他选项:

在此处输入图片说明

我将其用于一些小片段,它非常灵活。



1

如果您添加密钥LSUIElement并将其设置为您应用程序的1in 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>

谢谢,但这似乎没有效果。我还尝试touch打包,以确保使用了最新版本。但是无论如何,我不太喜欢捆绑方法,因为它似乎总是会创建单独的应用程序实例
toupeira

对我来说,触摸也没有帮助(我试图关闭LSUIElement),还有其他一些缓存,但是压缩和提取应用程序很有帮助。您为什么不喜欢捆绑方式?您也可以使用applescript并直接运行do shell script "say 'arsti'",这将不会打开终端窗口。
tig

好的,原来我只是个白痴;-)我找不到可靠的方法来检查应用程序是否已经在运行AppleScript,所以我使用了一个普通的bash脚本,该脚本调用pgrep,然后将相关代码直接传递给osascript(AppleScript解释器)。问题是pgrep来自Homebrew,而不是默认值$PATH。因此,即使我的脚本已经在运行,它也会始终启动一个新的iTerm实例。在pgrep脚本中添加了完整路径后,捆绑方法毕竟似乎可以正常工作,所以我认为我现在很高兴;-)
toupeira

将此答案与上面@JeffB的答案以及@tig的Info.plist的简化版本(我删除了the CFBundleExecutableCFBundleIconFilekey)相结合,我可以完美地使用它。
戴夫·兰德

0

这里有一些解决方法:

编译一个调用shell脚本的applescript :)

osacompile -e 'do shell script "cd ~; echo aaa > temp.txt"' -o ~/name_of_script.scpt

osacompile将编译'do shell script "XXX"'AppleScript的片段。您的Shell脚本是XXX。

请注意报价,shell脚本必须正确报价,以使您可以完整使用的shell可以通过。

但这可以从BetterTouchTool运行,而没有任何麻烦。


0

还有其他可能的锻炼方法。在自动工作流程中保护您的Shell脚本。使用启动调用工作流程。代码是:

/usr/bin/automator /path/to/the/file.workflow

这不会启动任何程序,也不会显示在菜单栏中,其方式比Platypus应用程序更安静。

执行shell脚本的更好方法是直接启动。

/bin/bash /path/to/shellScript.command

将在后台超安静地执行命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.