【问题标题】:How can execute a shell script from spotlight on macOS passing a first command line argument?如何在 macOS 上通过第一个命令行参数从 Spotlight 执行 shell 脚本?
【发布时间】:2021-06-10 06:01:05
【问题描述】:

我编写了一个 python 程序,它需要第一个命令行参数才能从终端运行。该程序可用于在使用特定关键字运行时将文本复制到剪贴板。

~ python3 mclip.py 'agree'

这个用例只是一个理解练习,我如何在 macOS 上运行批处理文件(或 macOS 术语中的 shell 脚本)。

我创建了以下shell脚本并将其保存为mclip.command

#!/usr/bin/env bash
python3 /Users/Andrea_5K/mclip.py

我的想法是从聚光灯输入窗口执行我的 shell 脚本,传递参数“同意”。我该怎么做?

在 Windows 上,批处理文件看起来像这样 (mclip.bat):

@py.exe C:\path_to_my_file\mclip.py %*
@pause

我可以按 WIN-R 并输入mclip *argument* 来运行程序。但是我怎样才能在 Mac 上做同样的事情呢?我无法在聚光灯下键入mclip agree,这不像在 WIN-R 中那样工作。

#! python3
# mclip.py - A multi-clipboard program.

TEXT = {
    'agree': """Yes, I agree. That sounds fine to me.""",
    'busy': """Sorry, can we do this later this week or next week?""",
    'upsell': """Would you consider making this a monthly donation?""",
}

import sys, pyperclip
if len(sys.argv) < 2:
    print('Usage: python mclip.py [keyphrase] - copy phrase text')
    sys.exit()

keyphrase = sys.argv[1] # first command line arg is the keyphrase

if keyphrase in TEXT:
    pyperclip.copy(TEXT[keyphrase])
    print('Text for ' + keyphrase + ' copied to clipboard.')
else:
    print('There is no text for ' + keyphrase)

【问题讨论】:

  • 由于 mac 是基于 unix 的,它更像是 linux 而不是 windows。第一个命令应该在 MAC imo 上运行。
  • 呃,你为什么不直接在你的 Python 脚本中放一个带有 python3 的 shebang 呢? env python3 的工作方式与 env bash 完全一样?!
  • 如果你总是需要提供agree作为参数,你为什么不修改脚本不需要它呢?或者在脚本中提供参数?
  • @MarkSetchell:我并不总是希望“同意”作为第一个命令行参数。它可以是任何一个单词字符串。我的程序只是获取 sys.argv[1] 参数并使用在命令行上输入的任何单词。
  • 我做了几个测试,似乎 Spotlight 不希望你这样做。我已删除我的答案,以免推迟其他潜在的回答者。让我们看看是否有人提出了可行的解决方案。另一种方法可能是在您的桌面上创建一个可双击的脚本,这确实有效。

标签: python bash macos


【解决方案1】:

我可以让 Spotlight 运行以下脚本:

  • 为您提供一个包含三个选项的对话框,并且
  • 然后通过选定的选项运行您的 Python 脚本

但我无法让 Spotlight 直接将选项传递给 Python 脚本。如果这有帮助,请按以下步骤操作。


启动Script Editor并输入以下代码,将其保存为app,名为mclip

set theArg to choose from list {"Agree", "Busy", "Upsell"} with title "Chooser Dialog" with prompt "Choose option"

tell application "Terminal"
    do shell script "/Users/YOURNAME/mclip.py " & theArg
end tell

请注意,在顶部添加 on run argv 仍然不会让您在 Spotlight 中添加任何参数 - 它似乎不想传递您在 Spotlight 对话框中键入的任何参数。


现在编写一个名为 $HOME/mclip.py 的 Python 脚本:

#!/usr/bin/env python3

import os, sys

 # Just write the received parameter into a text file on the Desktop to show how it works
file = os.path.expanduser("~/Desktop/result.txt")
with open(file, 'w') as f:
   f.write(sys.argv[1])

并使其可执行(只需要一次):

chmod +x $HOME/mclip.py

如果你现在使用Spotlight来运行mclip,它会弹出一个这样的对话框:

您可能需要在首次运行时回答安全问题 - 取决于您的 macOS 版本。

请注意,如果您的所有 Python 脚本所做的只是将一些文本复制到剪贴板上,您可以在上面的 Applescript 中不使用 Python,使用:

set the clipboard to "Some funky text"

【讨论】:

  • 好的,我已经做到了,但是现在我该如何使用聚光灯呢?键入 mclip.command 然后给出关键字不起作用...我传递的关键字用于在我的程序中引用字典。它获取值并将其粘贴到剪贴板以供进一步使用。我只是想知道 - 在 macOS 上 - 我是否有相同的选项来运行 shell 脚本,如 Windows 用户可以从 Windows PC 上的“运行窗口”运行批处理文件......正如我提到的那样,可以键入 mclip 关键短语 进入“运行”窗口。
  • 哇,看起来棒极了!这远远超出了我的预期,但我真的很感谢你的努力。您的代码涵盖了对我来说新的概念,但我很乐意阅读您的代码,这只是一个很好的练习,谢谢。
【解决方案2】:

假设shell脚本(mapIt.command)是:

#!/usr/bin/env bash
python3 /path/to/my/pythonScript.py $@ 

$@ 被解释为命令行参数列表。

我可以像这样在 MacOS 终端中运行 shell 脚本:

sh mapIt.command Streetname Number City

命令行参数 Streetname Number City 被转发到 python 脚本。

【讨论】:

  • 那么您是如何从聚光灯下运行的?
【解决方案3】:

只是一个细节:python 区分大小写。因此,如果字典的键是小写的,那么苹果脚本中的列表值应该是小写的`:D

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 2011-06-17
    • 2015-11-01
    • 2019-11-06
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多