【问题标题】:Mac OSX - Allow for user input in shell script via GUI or PromptMac OSX - 允许用户通过 GUI 或提示在 shell 脚本中输入
【发布时间】:2015-08-31 11:47:14
【问题描述】:

我创建了一个 shell 脚本,它需要一个人输入他们的姓名,然后生成一个报告。当chmoded 进入可执行脚本并从终端运行时,该脚本会根据需要运行。但是,我想部署它并让它成为一种双击类型的解决方案,而不是指示人们从终端运行它。

我尝试将脚本封装在 Platypus 中,这样可以轻松启动。但它不允许用户输入,这很关键。

我刚刚找到cocoaDialog,但我主要担心的是它是否能提供我需要的功能,并且不需要其他人安装它。

有没有人遇到过这种情况或可以提供任何指点?

【问题讨论】:

  • 在脚本顶部添加一个 shebang 行,例如:#!/bin/bash 并使用 chmod +x script.sh 使脚本可执行。就是这样。
  • 我知道我的脚本在我运行时可以在终端中完美运行。我正在寻找能够双击文件的功能..让它运行并接收输入。如果我将文件保留为脚本,用户将不得不从终端运行它或更改文件关联以启动脚本。
  • 嗯,在 Linux 上,可以双击可执行的 shell 脚本从桌面执行它。如果你想要更复杂的东西(图标、描述等),你需要创建一个 .desktop 文件(至少在 Gnome 中它们被称为 .desktop)。我猜在 OSX 中是类似的。
  • 顺便说一句,你为什么不在发布问题之前使用谷歌?我发现这个没有问题:stackoverflow.com/questions/5125907/…
  • 我确实欠你一个道歉。该链接(我之前阅读过)确实也有我正在寻找的答案。这使它成为一个 .command 分机。我只是没有碰巧读到那么远,因为它没有被标记为解决方案。谢谢。

标签: macos bash shell


【解决方案1】:

作为记录,我(在 OS X Yosemite 上)测试了以下脚本 (namescript),它使用 read 命令接受用户输入。在chmod +x namescript 之后,从 Finder 双击正确启动脚本并接受用户输入。

    #! /bin/bash

    echo "Please enter your name"
    read name
    echo "Your name is $name"

为脚本选择一个没有扩展名(如namescript)或.command 扩展名(namescript.command)的名称很重要。默认情况下,使用 .sh (namescript.sh) 会导致双击以在文本编辑器中打开脚本,如 OP 中所述。

【讨论】:

  • 当脚本与终端关联打开时,它可以完美运行。但默认是在文本编辑器中打开,这可能会给我带来问题。
  • 好的,如果你不使用“.sh”——这样你就有了一个没有扩展名的可执行文件——它可以在终端上正常打开,而不需要摆弄与操作系统相关的应用程序设置。
  • 问题是,如果我部署它并且有人下载了脚本,权限就会被剥夺,并且用户必须在下载后对其进行 chmod 才能运行它。
  • 是的,您需要将其打包为 zip 以使其可执行。
  • 仅供参考,在 OS 10.11+ 中可能会弹出错误提示“来自身份不明的开发人员的脚本”。解决方法是告诉您的用户 (1) Right-Click 文件,(2) Hold Shift 当菜单仍然显示时 (3) Choose Open,仍然按住 Shift (4) 在结果对话框上单击 Open .它永远不会再向您询问此文件。
【解决方案2】:

OS X 包含(大部分)所有电池,只需使用它即可。 :)

为此,您可以使用Automator.app。使用 Automator,您可以创建可执行应用程序(例如 your.app),其中将包含您的 shell 脚本并要求用户输入。

例如,要求输入两个输入:“姓名”和“年份”,您应该执行以下操作:

  • 启动自动机
  • 选择“应用程序”
  • 如果库被隐藏,请单击工具栏上的“库”按钮
  • 将以下操作从库中拖到工作流中
    • “请求文本”
      • 输入问题:“名字和姓氏:”
      • 点击“要求回答”
    • “设置变量值”
      • 创建新变量“名称”
    • “请求文本”
      • "输入第二个问题,例如"输入年份:"
      • 添加默认值,例如2015 年(如果需要)
      • 点击“需要回答”复选框
      • 勾选“选项”中的“忽略此操作输入”
    • "获取变量的值
      • 选择“名称”
    • “运行 Shell 脚本”
      • 选择“传递输入”->“作为参数”
      • 将您的 shell 脚本复制并粘贴到窗口中,例如:
year="$1"
name="$2"
echo "Report for name: $name year: $year"
  • 另外,您可以添加最终操作“复制到剪贴板”,例如shell 脚本的输出将进入剪贴板。

保存脚本(您将获得一个 name.app - 标准 OS X .app 应用程序),只需将其添加到 .dmg 或从中创建一个 .zip 即可部署它。

阅读这个答案,一切都快得多。 ;)

【讨论】:

  • 我会试一试,似乎我必须调整我的脚本,因为我在其中声明了我的名字和姓氏变量..所以我可能会将这些变量从脚本本身..我会在可以尝试的时候更新。
  • 此解决方案适用于我需要的工作流程。我在使用以下首字母命名我的文件时遇到问题:initial="$(echo $first_name | head -c 1)" touch ~/Desktop/$initial$last_name,但这可能只需要我稍微调整一下。感谢所有帮助过的人。
  • 请注意:使脚本可执行并使其成为 .command ext 似乎也对我有用。
  • @SpacemanTrip 是的,如果你可以启动终端,任何脚本的 .command 扩展将启动 terminal.app 并在里面运行脚本。 (但是,没有 GUI)。 :)
  • 实际上我放弃了 Automator,因为它不能正确处理变量,而且我无法让我的输出文件用我的名字和姓氏命名...
【解决方案3】:

据我了解,我建议您查看 Applescript,因为这将允许您拥有 GUI 界面以及执行“SHELL”命令。

首先我会打开预装在 Mac 上的“脚本编辑器”程序

这是一个示例脚本,它询问用户的姓名,然后通过执行 shell 命令“say name”说出它

display dialog "What is you name? " default answer "" buttons {"Say It"} default button 1
text returned of the result
do shell script "say " & result

您也可以将with administrator privileges 附加到do 命令中,使其以管理员权限运行(询问管理员用户名和密码)

例子:

display dialog "What is you name? " default answer "" buttons {"Say It"} default button 1
text returned of the result
do shell script "say " & result with administrator privileges

希望这会有所帮助。

【讨论】:

  • Applescript 是我认为最适合这项任务的工具,当我在创建脚本后开始四处挖掘时也是如此。我也会尝试一下,并随时通知您。
  • 看起来我回到了 AppleScript,因为它具有我想要的部署......只是我无法让我的 BASH 脚本在其中工作。我要疯了。
  • 如果您遇到问题,我猜您可能会卡在text returned of the result 上,请记住您的每一个问题都应该在这三行结构中列出。 (问题 -> 数据 -> 功能)
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 2011-10-28
  • 2011-04-03
  • 1970-01-01
  • 2011-04-10
  • 2016-10-12
  • 2019-09-16
相关资源
最近更新 更多